Android ではかなり一般的に発生する状況があります。これは、以前の asynctask がアクティビティを更新しているのに、向きが変わったためにアクティビティが失われたことに関係しています。
アクティビティ A があります。
Activity A implements OnDownloadCompleteListener {
public void sync()
{
new SyncAttestationInfoTask(this).execute();
}
@Override
public void onComplete()
{
loadAttestationInfo();
}
}
これが短縮された私の asynctask です:
package com.evento.mofa.backgroundtasks;
import java.util.ArrayList;
import java.util.List;
/**
* @author Ahmed
*
*/
public class SyncAttestationInfoTask extends AsyncTask<Void, Void,Void> {
/*TIP*/
//TO SPEED UP THIS OPERATION WE CAN USE THE EXECUTEONEXECUTOR .
private ProgressDialog pd;
private OnDownloadComplete parentActivityContext;
EntityConvert convert = new EntityConvert();
private AttestationDao aDao = new AttestationDao();
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
if (Locale.getDefault().getLanguage().equals("ar"))
{
/*EMPTY ALL THE TABLES THEN START PROCESSING*/
aDao.flushTables(Locale.getDefault().getLanguage());
syncAttestLocations(Webservices.ATTEST_LOCATION_AR,1);
syncDocumentTypes(Webservices.DOCUMENT_TYPES_AR,1);
syncAttestationInfo(Webservices.ATTESTATION_INFO_AR,1);
} else {
/*EMPTY ALL THE TABLES THEN START PROCESSING*/
aDao.flushTables(Locale.getDefault().getLanguage());
syncAttestLocations(Webservices.ATTEST_LOCATION,0);
syncDocumentTypes(Webservices.DOCUMENT_TYPES,0);
syncAttestationInfo(Webservices.ATTESTATION_INFO,0);
}
return null;
}
public SyncAttestationInfoTask(OnDownloadComplete context) {
parentActivityContext = context;
}
@Override
protected void onPreExecute() {
pd = new ProgressDialog((Context)parentActivityContext);
pd.setTitle("Loading...");
pd.setMessage("Updating Data.");
pd.setCancelable(false);
pd.setIndeterminate(true);
pd.show();
}
@Override
protected void onPostExecute(Void result) {
pd.dismiss();
parentActivityContext.onComplete();
// findViewById(R.id.the_button).setEnabled(true);
}
}
アクティビティに奇妙な点があります。
- アクティビティ内の onComplete コールバックにブレークポイントを設定しました
- sync async タスク内で進行状況ダイアログを開始します。
- 進行状況ダイアログが画面に表示されるとすぐに、デバイスを横向きにします。
- ダイアログ ボックスが消え、
pd.dismiss()
「ビューが添付されていません」というエラーが発生します (添付されていたアクティビティが存在しないことは理解しています)。 - 上記は
parentActivityContext().oncomplete
、同じエラーをスローする必要があることを意味しますが、そうではありません。 - にコメントした
pd.Dismiss()
ところ、ブレークポイントonComplete()
が呼び出されていることがわかりましたか? この時点でアクティビティへの参照が失われているという事実を考えると、これは奇妙ではありませんか?
これについての洞察を教えてください。