0

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()が呼び出されていることがわかりましたか? この時点でアクティビティへの参照が失われているという事実を考えると、これは奇妙ではありませんか?

これについての洞察を教えてください。

4

2 に答える 2

1

私はこれをするだろう

この行を Manifest.xml ファイルに追加します。これによりonCreate()、画面が回転したときに呼び出されなくなります。

<activity android:name=".yourActivity" android:configChanges="keyboardHidden|orientation">

Android 3.2 より上のバージョンでは、「screenSize」も追加する必要があります。

<activity android:name=".yourActivity" android:configChanges="keyboardHidden|orientation|screenSize">

これにより、方向の変更時にアクティビティが再起動するのを防ぐことができ、問題は発生しないはずです (一部のレイアウト修正を除く)。

于 2013-09-20T15:45:42.447 に答える