從Android活動中,我發送由用戶按下UI上的按鈕驅動的http請求。 我不想同時運行多個請求(OutlookClient崩潰)。通過回調寫入的布爾值上的競爭條件並在活動中讀取
我的問題是:是否有可能有競爭條件由於回調結果編寫相同的布爾值(使用runOnUiTread)在發送新的請求之前讀取?
感謝
// Should this be either "volatile" or atomic ??
private boolean isThereAPendingRequest = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
genericClient = clientInitializer.create(this);
// ...
isThereAPendingRequest = true; // still have to login
Futures.addCallback(genericClient.logon(this, scopes), new FutureCallback<Boolean>() {
@Override
public void onSuccess(Boolean result) {
// ...
isThereAPendingRequest = false;
}
@Override
public void onFailure(@NonNull Throwable t) {
// ...
isThereAPendingRequest = false;
}
});
// ...
}
// ...
public void getBookings(View view){
if(isThereAPendingRequest){
Toast.makeText(getApplicationContext(), "There's already a pending request. Try in a few seconds.", Toast.LENGTH_LONG).show();
return;
}
isThereAPendingRequest = true;
Futures.addCallback(genericClient.getCalendarEvents(), new FutureCallback<List<List>>(){
@Override
public void onSuccess(final List<List> resultCalendars) {
Log.d("APP", "Success. Result: "+resultCalendars);
runOnUiThread(new Runnable() {
@Override
public void run() {
// ..
isThereAPendingRequest = false;
}
}
}
// ..
}
public void sendBooking(View view){
if(isThereAPendingRequest){
Toast.makeText(getApplicationContext(), "There's already a pending request. Try in a few seconds.", Toast.LENGTH_LONG).show();
return;
}
isThereAPendingRequest = true;
Futures.addCallback(genericClient.sendBooking(booker, title), new FutureCallback<List<String>>(){
@Override
public void onSuccess(final List<String> resultBooking) {
Log.d("APP", "Success. Result: "+resultBooking);
runOnUiThread(new Runnable() {
@Override
public void run() {
// ...
isThereAPendingRequest = false;
}
});
}
@Override
public void onFailure(Throwable t) {
Log.e("APP", "Delete error. Cause: "+t.getLocalizedMessage());
// ...
Toast.makeText(getApplicationContext(), "Fail!", Toast.LENGTH_LONG).show();
isThereAPendingRequest = false;
}
});
}catch(Exception ex){
// logger
isThereAPendingRequest = false;
}
}
UPDATE:這就是所謂的中證期貨的功能之一..
public ListenableFuture<List<List>> getCalendarEvents(){
// logger
final SettableFuture<List<List>> future = SettableFuture.create();
DateTime now = new DateTime(DateTimeZone.UTC);
DateTime workDayEnd = new DateTime(now.getYear(), now.getMonthOfYear(), now.getDayOfMonth(), 23, 59, 0);
Futures.addCallback(
mClient .getMe()
.getCalendarView()
.addParameter("startDateTime", now)
.addParameter("endDateTime", workDayEnd)
.read(),
new FutureCallback<OrcList<Event>>() {
@Override
public void onSuccess(final OrcList<Event> result) {
// ...
future.set(myList);
}
@Override
public void onFailure(@NonNull Throwable t) {
// ...
future.setException(t);
}
}
);
return future;
}
我用一個叫做的函數更新了這個問題。將來我不會收到日曆事件,因爲我會通過BroadcasterReceiver接收這些更新。那樣會導致問題嗎?我應該只是爲了防止問題而將其變得易變?再次感謝 –