簡體   English   中英

需要一些幫助來了解此AsyncTask方案

[英]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來實現您的目的是一個好主意,但后來發現,這樣做不起作用,因為您離開了DetailActivityDetailActivity了電話,最后可能無法獲得廣播。

相反,我建議您實施服務 ,因為您的Activity可以bindunbindService並詢問有關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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM