2016-03-26 19 views
0

herhangi bir cevap çok takdir edilecektir.2 AsyncTasks Döngüleri Nasıl?

Yükleme hızını ölçen ve yükleme hızını ölçen biri olan iki AsyncTasks var. Uygulamanın, kullanıcı duruncaya kadar indirme ve yükleme hızlarını sürekli olarak ölçmesini istiyorum. Sonra

togglebutton = (ToggleButton) findViewById(R.id.toggleButton); 
togglebutton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (isChecked) { 
      while (isChecked) { 
       new Download.execute(); 
       new Upload.execute(); 
      } 
     } else { 
      // The toggle is disabled 
     } 
    } 
}); 

Ben geçiş düğmesi, uygulama donuyor tıklayın

ve çöküyor: Şu an, çünkü OutOfMemoryError ait sonlandırılıyorsa bir geçiş düğmesi vardır. Asynctasks'ımın birden çok örneğini oluşturmanın problemin sebebi olduğunu varsayıyorum. Bunu uygulamak için daha iyi bir yolu var mı?

Not: Ben Asynctasks izleyen bir tarzda çalıştırmak için gerektiğinden çalışacak doInBackground içinde döngü sanmıyorum, yani Download.execute, Upload.execute, Download.execute, Upload.execute ...

onay kutusu ilk kez denetlenir
if (isChecked) { 
     while (isChecked) { 
      new Download.execute(); 
      new Upload.execute(); 
     } 
    } else { 
     // The toggle is disabled 
    } 

, bir sonsuz döngüye giriyoruz:

03-25 23:31:36.261 15881-15888/com.kingrandesigns.uploadpicturetutorial E/art: Throwing OutOfMemoryError "Failed to allocate a 28 byte allocation with 0 free bytes and 3GB until OOM" (recursive case) 
03-25 23:31:36.261 15881-15881/com.kingrandesigns.uploadpicturetutorial I/art: Alloc sticky concurrent mark sweep GC freed 0(0B) AllocSpace objects, 0(0B) LOS objects, 0% free, 128MB/128MB, paused 25.421ms total 29.582ms 
03-25 23:31:36.261 15881-15894/com.kingrandesigns.uploadpicturetutorial I/art: WaitForGcToComplete blocked for 29.847ms for cause Background 
03-25 23:31:36.261 15881-16557/com.kingrandesigns.uploadpicturetutorial I/art: WaitForGcToComplete blocked for 877.665ms for cause Alloc 
03-25 23:31:36.271 15881-15888/com.kingrandesigns.uploadpicturetutorial E/art: "JDWP" daemon prio=5 tid=3 Runnable 
03-25 23:31:36.271 15881-15888/com.kingrandesigns.uploadpicturetutorial E/art: | group="system" sCount=0 dsCount=0 obj=0x12c5f080 self=0xaf20e400 
03-25 23:31:36.271 15881-15888/com.kingrandesigns.uploadpicturetutorial E/art: | sysTid=15888 nice=0 cgrp=apps sched=0/0 handle=0xb4922200 
03-25 23:31:36.271 15881-15888/com.kingrandesigns.uploadpicturetutorial E/art: | state=R schedstat=(2731136812 186756673 920) utm=267 stm=6 core=0 HZ=100 
03-25 23:31:36.271 15881-15888/com.kingrandesigns.uploadpicturetutorial E/art: | stack=0xb4366000-0xb4368000 stackSize=1012KB 
03-25 23:31:36.271 15881-15888/com.kingrandesigns.uploadpicturetutorial E/art: | held mutexes= "mutator lock"(shared held) 
03-25 23:31:36.271 15881-15888/com.kingrandesigns.uploadpicturetutorial E/art:  at java.nio.ByteBuffer.wrap(ByteBuffer.java:113) 
03-25 23:31:36.271 15881-15888/com.kingrandesigns.uploadpicturetutorial E/art:  at org.apache.harmony.dalvik.ddmc.ChunkHandler.wrapChunk(ChunkHandler.java:80) 
03-25 23:31:36.271 15881-15888/com.kingrandesigns.uploadpicturetutorial E/art:  at android.ddm.DdmHandleHeap.handleHPIF(DdmHandleHeap.java:112) 
03-25 23:31:36.271 15881-15888/com.kingrandesigns.uploadpicturetutorial E/art:  at android.ddm.DdmHandleHeap.handleChunk(DdmHandleHeap.java:85) 
03-25 23:31:36.271 15881-15888/com.kingrandesigns.uploadpicturetutorial E/art:  at org.apache.harmony.dalvik.ddmc.DdmServer.dispatch(DdmServer.java:171) 
03-25 23:31:36.271 15881-15888/com.kingrandesigns.uploadpicturetutorial I/art: Exception thrown by dispatcher for 0x48504946 

cevap

1

bu koda bir bakın: İşte logcat var Bu, belleğin bitmesine kadar yeni Yükleme ve Yükleme örneklerini oluşturmaya devam ediyor. Ana iş parçacığı hiçbir zaman onay kutusunun tekrar kontrol edilebileceği boş bir duruma girmeyecektir.

AsyncTask'ın başka bir iş parçacığı üzerinde çalışma planlandığı sırada AsyncTask üzerinde yürütmenin hemen akılda tutulduğunu unutmayın. Yürütme çağırdığınızda, görevin tamamlanmasını beklemez.

+0

Bu mantıklı. Bunu uygulamak için alternatif bir fikrin var mı? Kullanıcı durmak istediği zamana kadar bu uyumsuzlukları çözmenin bir yolu var mı? –

+0

AsyncTask bunun için iyi bir araç değildir. Çalışmayı gerçekleştiren farklı thread'larla çalışan iki farklı Servis düşünün. Etkinlikle ihtiyaç duyduğunuz etkileşim miktarına bağlı olarak uygulanması önemsizdir. Yaptığınız şey kesinlikle bir android uygulaması için tipik bir durum değildir. –

İlgili konular