[英]Need a little help understanding this AsyncTask scenario
我需要清楚地了解在我的場景中AsyncTask處理將如何進行。 我有一個簡單的Java對象,稱為Donor 。
有一個活動(例如DonorDetailActivity )可以修改該施主對象。 修改發生在AsyncTask <>中 (例如DonorEditService )。 因此,從DonorDetailActivity中 ,調用DonorEditService , 后者在后台線程中編輯Donor ,並將結果發布到主UI線程。
DonorDetailActivity類
public class DonorDetailActivity extends ActionBarActivity implements AsyncTaskCallback<Donor>{
@Override
protected void onCreate(Bundle savedInstanceState) {
btnEditDonor.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { //Invoke the DonorEditService
DonorEditService editService = new DonorEditService(DonorDetailActivity.this);
editService.execute(donor);
}
});
}
//Invoked from DonorEditService.onPostExecute(DonorBase updatedDonor)
@Override
public void onAsyncTaskCompleted(Donor updatedDonor) {
updateUI(); //Refresh screen with updatedDonor
}
}
所有這些更新的供體代碼均正常運行。 現在,我遇到了一種情況,用戶可以打電話給捐助者。 在此過程中,我必須更新供體字段以反映上次調用日期。 為此,我可以看到兩種方式。 首先在后台線程中更新施主,然后啟動“電話意圖”,或者先啟動“施主意圖”,然后更新施主。 明智的代碼如下
首先更新然后致電
//Update Donor
DonorEditService editService = new DonorEditService(activity);
donor.setLastCallDate(Calendar.getInstance().getTime());
editService.execute(donor);
//
Intent phoneIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + prefix + donor.getMobileNumber()));
activity.startActivity(phoneIntent);
先致電再更新
Intent phoneIntent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + prefix + donor.getMobileNumber()));
activity.startActivity(phoneIntent);
//Update Donor
DonorEditService editService = new DonorEditService(activity);
donor.setLastCallDate(Calendar.getInstance().getTime());
editService.execute(donor);
//
幸運的是或不幸的是,這些都在模擬器上工作。 唯一需要注意的是,如果調用活動未處於OnResume狀態,則如何調用AsyncTask.onPostExecute() 。 那就是它被“ 電話活動”所阻止。 另外,哪種方法更好? 首先編輯並呼叫; 或首先呼叫,然后編輯
編輯:
我只是從@Darwind的注釋中意識到,我應該已經顯示了DonorEditService的代碼,它實際上是AsyncTask<DonorBase>
(而不是android Service )。 DonorBase是Donor的超類。
這是DonoEditService代碼的一部分
public class DonorEditService extends AsyncTask<DonorBase, Void, DonorBase> {
public DonorEditService(Activity activity, boolean displayProgressDialog) {
...
}
@Override
protected void onPreExecute() {
//Show Progress Dialog for Donor Edit process
}
@Override
protected DonorBase doInBackground(DonorBase... donors) {
//Carry out the Http request to Edit Donor on Server
...
}
@Override
protected void onPostExecute(DonorBase updatedDonor) {
//Run on Main UI thread. I invoke AsyncTaskCallback from here
taskCallback.onAsyncTaskCompleted(updatedDonor); //taskCallback is DonorDetailActivity implementing AsyncCallback
...
}
}
好了,有很多解決方案可以解決您的問題。
首先,我建議您不要將DetailActivity
作為參數傳遞給AsyncTask
,因為這會導致泄漏。
起初,我認為使用BroadcastReceiver來實現您的目的是一個好主意,但后來發現,這樣做不起作用,因為您離開了DetailActivity
並DetailActivity
了電話,最后可能無法獲得廣播。
相反,我建議您實施服務 ,因為您的Activity
可以bind
和unbind
到Service
並詢問有關Service
信息。 這個想法是,即使用戶離開了DetailActivity
,您的Service
也將運行,因此可以保留一些數據,直到用戶回到您的應用程序為止。
然后,當用戶返回到您的應用並繼續執行DetailActivity
您只需要再次“綁定”到Service
並請求查看用戶離開時是否發生了更改。
您可以保留您的AsyncTask
,而不是讓DetailActivity
直接調用它,而是讓Service
直接調用它,因此DetailActivity
調用Service
,這將調用AsyncTask
。
現在,我看到您已經為DetailActivity
實現了一個Observer pattern
,以便在AsyncTask
完成時得到通知。 我實際上不是建議這種“很難耦合的”觀察者模式,而是建議您實現BroadcastReceiver ,因此AsyncTask
會將“廣播”發送到DetailActivity
。 現在,當DetailActivity
暫停(用戶正在撥打電話)時, DetailActivity
將不會接聽廣播,但這很好。 僅當用戶將您的應用程序聚焦在100%(可見)時,才可以選擇廣播。
抱歉,文本不完整,但這有點像“高級”主題。 希望對您有所幫助,否則,我將嘗試擴展一些代碼:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.