2013-09-20 5 views
0

У меня довольно часто встречающаяся ситуация в Android, которая связана с предыдущей асинхронной модификацией активности, в то время как активность была потеряна из-за изменения ориентации.OrientationChange не разрушает активность?

У меня есть деятельность, деятельность А.

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 внутри моей деятельности
  • я начинаю прогресс диалоговое внутри задачи синхронизации асинхронной.
  • Как только на экране отображается диалоговое окно прогресса, я просматриваю свое устройство.
  • Диалоговое окно исчезает, и pd.dismiss() вызывает ошибку «View not attach» (я понимаю, что активность, к которой она привязана, больше не существует).
  • Вышеуказанное означает, что parentActivityContext().oncomplete также должен выдать ту же ошибку, однако это не так.
  • Я прокомментировал pd.Dismiss() и выяснил, что вызывается точка останова на onComplete()? Разве это не странно, учитывая тот факт, что ссылка на деятельность была потеряна в этот момент?

Просьба дать мне представление об этом.

ответ

0

Предыдущие Activty ссылаются на AsyncTask через сильную ссылку.

  • AsyncTask построен с активностью 1 (parentActivityContex = активность 1)
  • активность 1 "уничтожены" и активность 2 приходит на передний план
  • AsyncTask завершает, вызывает parentActivityContext (активность 1) OnComplete
  • активность 2 просто сидит там ничего не делает
  • Активность 1 больше не содержит активных ссылок, указывающих на него, собрано

Вы можете попробовать выполнить свою задачу в Службе и иметь любую активность, которая находится на переднем плане, получать трансляцию, или вы могли бы попытаться использовать ссылку на ваш AsyncTask Фрагмент с setRetainInstance(true). Ниже приведен пример второго случая. Обратите внимание, что вы можете обрабатывать случай, когда AsyncTask завершает в то время как фрагмент отделяется от одной деятельности и еще не привязан к следующей деятельности

public class ExampleDownloadFragment extends Fragment { 
    @Override 
    public void onCreate(final Bundle savedInstanceState) { 
     setRetainInstance(true); 
     new SyncAttestationInfoTask(this).execute(); 
    } 

    public void onComplete() { 
     final Activity activity = getActivity(); 
     if (activity != null && activity instanceof A) { 
      ((A) activity).onComplete(); 
     } 
    } 
} 
+0

спасибо. Я хотел бы использовать фрагментный подход. Однако в настоящее время мое приложение не использует никаких фрагментов. Просто старая школьная деятельность. Это проблема, или я все еще могу выполнить задачу с кодом, который вы предложили? , –

+0

Если вы хотите поддерживать уровни API более ранних, чем 10, вам нужно будет включить библиотеку поддержки и расширить ваши действия «FragmentActivity» и использовать 'getSupportFragmentManager()'. В противном случае вы можете просто использовать не поддерживающую библиотеку Фрагменты и FragmentManager – JuniKim

1

Я хотел бы сделать это

Добавить эту строку в файл Manifest.xml, это предотвратит вызов onCreate() при вращении экрана.

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

версия выше Android 3.2, также необходимо добавить «Размер экрана»:

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

Это предотвратит активность перезагружать по изменению ориентации, и вы не должны иметь никаких проблем (за исключением, может быть, какой-то макет исправления)

+1

Спасибо вам @Quillion –

+0

@Muhammad Ахмед АбуТалиба не проблема :) извините, что это было не то, что вы имели в виду – Quillion

Смежные вопросы