2012-05-21 23 views
5

AsyncTasks'ın başlatma etkinlikleri ile birlikte yok edilmediğini ifade ettim. Ve true.Android OnDestroy() ve AsCreate() yeniden başlatıldıktan sonra AsyncTask'a yeniden bağlanılıyor mu?

AsyncTask'ı her 3 saniyede bir Log.i() mesajını 1 dakikada yayınladım. Ve aktivitenin onDestroy() yöntemine Log.i() messsage koydu.

Etkinliğin yok edildiğini görüyorum, ancak AsyncTask, tüm 20 Log.i() iletilerini tamamlayana kadar çalışmaya devam ediyor. Ve ben kafam karıştı.

  1. Ne AsyncTask tahrip UI'ya publishProgress() olsaydı?
    Sanırım bir çeşit istisna meydana geliyor, değil mi?

  2. AsyncTask verileri class Application global değişkeninde depolarsa ne olur?
    Burada bir fikir yok, NullPointer istisnası?

  3. Uygulama yeniden başlatılırsa ne olur?
    Muhtemelen yeni bir AsyncTask başlatır. Hala çalışan AsyncTask ile yeniden bağlanabilir mi?

  4. Ana uygulama yok edildikten sonra AsyncTask ölümsüz mü?
    Belki evet, UI uygulaması artık görünür değilken, tüm LogCat uygulamaları iletileri günlüğe kaydetmeyi sürdürüyor, belki de yok olabilir? Ve onları yeniden açtığınızda, size “ölü” iken ortaya çıkan dağınıklıkları gösterirler.

Tüm bunlar bir tartışma gibi görünüyor, ama soru başlıkta. Uygulamanın yeniden başlatıldığı zaman yeniden bağlanmak istediğim bu yetim AsyncTask'ım var, ama nasıl yapacağımı bilmiyorum.

Bunun neden önemli olduğunu söylemeyi unuttum. Bir yön değişikliği olduğunda uygulama bozulur. Ve AsyncTask tarafından üretilen verileri kaybetmek istemiyorum, onu durdurmak ve yeniden başlatmak istemiyorum. Yönlendirme değişikliklerinin yapılmasından sonra devam etmesini ve yeniden bağlanmasını istiyorum.

cevap

1

Umarız şu an kullandığım bazı eski kodlardan bu kadar haklıyım (şimdi kullandığım şeyi yapmak için IntentService kullanıyorum).

Bu

public class MyMainActivity extends Activity { 

    FileDownloader fdl = null; 

    ... 

    // This is an inner class of my main Activity 
    private class FileDownloader extends AsyncTask<String, String, Boolean> { 
     private MyMainActivity parentActivity = null; 

     protected void setParentActivity(MyMainActivity parentActivity) { 
      this.parentActivity = parentActivity; 
     } 

     public FileDownloader(MyMainActivity parentActivity) { 
      this.parentActivity = parentActivity; 
     } 

     // Rest of normal AsyncTask methods here 

    } 
} 

anahtar AsyncTask 'kurtarmak' için onRetainNonConfigurationInstance() kullanmaktır ... Ben benim ana Activity dosyaları indirirken Başlangıçta bu var.

Override 
public Object onRetainNonConfigurationInstance() { 

    // If it exists then we MUST set the parent Activity to null 
    // before returning it as once the orientation re-creates the 
    // Activity, the original Context will be invalid 

    if (fdl != null) 
     fdl.setParentActivity(null); 
    return(fdl); 
} 

Sonra onResume()Boolean, eğer a downloadComplete doğru gösteren denir doDownload() adlı bir yöntem vardır. Boolean, FileDownloader'un onPostExecute(...) yönteminde ayarlanır.

private void doDownload() { 
    // Retrieve the FileDownloader instance if previousy retained 
    fdl = (FileDownloader)getLastNonConfigurationInstance(); 

    // If it's not null, set the Context to use for progress updates and 
    // to manipulate any UI elements in onPostExecute(...) 
    if (fdl != null) 
     fdl.setParentActivity(this); 
    else { 
     // If we got here fdl is null so an instance hasn't been retained 
     String[] downloadFileList = this.getResources().getStringArray(R.array.full_download_file_list); 
     fdl = new FileDownloader(this); 
     fdl.execute(downloadFileList); 
    } 
}