2013-08-21 16 views
6

Aşağıdaki yöntemi ihtiva eden iç içe geçmiş bir parçasını vardır:Android AsyncTask - doInBackground() neden idam edilmiyor?

public void onSave() { 
    if (getActivity() == null || view == null) return; 
    if (file != null && file.exists()) { 
     new AsyncTask<Void, Void, Void>() { 
      @Override 
      protected void onPreExecute() { 
       Log.d("log", "onPreExecute of save ex"); 
      } 

      @Override 
      protected Void doInBackground(Void... params) { 

       Log.d("log", "doInBackground of save ex"); 
       //DO SOMETHING 
       return null; 
      } 

      protected void onPostExecute(Void result) { 
       BaseFragment fragment = new LocalListFragment(); 
       ((LocalLauncherFragment)(LocalEditFragment.this.getParentFragment())).setFragment(fragment); 
       Log.d("log", "end of save ex"); 
      }; 
     }.execute(); 
    } else { 
     showAlert(); 
    } 
} 

Sorunum ilk kez bu yöntemi çağrısı, o OnPostExecute kadar yürütür olmasıdır(). Bununla birlikte, başka bir parçaya gidersem ve bu parçayı yeni açarsa (yeni bir parça nesnesi oluşturarak ve yerine yenisiyle), sadece onPreExecute() çalıştırılır. Bu asyncTask nesnesi neden ikinci kez iyi çalıştırılmıyor?

ExecuteOnExecutor() işlevini kullanırsam intestingly, ikinci kez çalışır. Ama neden yürütme() çalışmıyor? AsyncTask'ın hayatı parçalara mı bağlıydı?

Şimdiden teşekkürler!

+0

Bu konuda kesin değilim, ancak Fragmanlar UI bileşenlerine sahip olabilir, bu yüzden arka plan iş parçacıklarında onlarla uğraşmaya dikkat etmeliyim. Günlük ifadenizi 'doInBackground' yöntemindeki ilk satır olarak eklemeyi ve görünüp görünmediğini görmeyi denediniz mi? – kabuko

+0

Evet yaptım. ilk denemede, hem onPreExecute() doInBackground() çağrılır, ancak ikinci kez sadece onPReExeucte() çağrılır :( – user2062024

+0

"executeOnExecutor" kullandığınızda, 'THREAD_POOL_EXECUTOR' kullandığınızı tahmin ediyorum ve değil SERIAL_EXECUTOR' ile? SERIAL_EXECUTOR' ile deneyin ve ben de aynı (istenmeyen) davranışı alırsınız. – kabuko

cevap

1

Bana AsyncTask'da bir şey asılı gibi geliyor. Android AsyncTask'un modern sürümlerinde, çok iş parçacıklı olan bir Executor belirtmediğiniz sürece tek bir iş parçacığı üzerinde çalışır. onPreExecute(), hala ana iş parçacığı üzerinde çalıştığı için başarıyla çalıştırılıyor. Tek arka plan iş parçacığı hala ilk aramaya asılı olduğundan, doInBackground'u ikinci kez göremezsiniz. Hangisinin neden kaynaklandığını görmek için LocalKeekLauncherFragment.setFragment(fragment) içeriğini incelemeniz gerekir.

+0

Aslında bu 2 satırlık parça geçişinin onPostExecute() içinde olması gerekiyordu. Kod kodunu düzenledim. ilk denemede onPreExecute(), doInBackgroiund(), onPostExecute() çalıştırır. ikinci denemede yalnızca onPreExecute() çalıştırır. Eğer ilk denemede onPostExecute() çalışırsa, ilk önce AsyncTask'ın asılmadığı anlamına gelir. dene, öyle değil mi? – user2062024

+0

AsyncTask'ımın engellendiğini anladım çünkü ikinci kez çalıştırdıktan sonra AsyncTask.execute() işlevinin çalışmayı durdurduğu diğer tüm bölümleri öğrendim. – user2062024

+0

Bunu yapmadan önce asyncTask durumunu kontrol ettim ve ikinci denemede iyi görünüyor .. – user2062024

0

DoInBackground iş parçacığının muhtemelen ikinci kez kilitlendiğini görüyoruz. İlk kez denediğimizden emin olmak için onPostExecute çağrıldığından emin olun ve bu yalnızca doInBackground değeri başarıyla döndürdüğünde kullanılabilir.