2016-03-26 5 views
0

回答は非常に高く評価されます。2つのAsyncTasksをループするには?

私はダウンロード速度を測定するものとアップロード速度を測定するものの2つのAsyncTaskを持っています。私は、ユーザーが停止と言うまで、ダウンロードとアップロードの速度を継続的に測定するアプリを望みます。今、私は理由のOutOfMemoryErrorのクラッシュしトグルボタンがあります。

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 
     } 
    } 
}); 

私はトグルボタン、アプリがフリーズして、クラッシュをクリックします。私は私のAsynctasksの複数のインスタンスを作成すると仮定している問題の原因です。これを実装する方法はありますか?

注:私はAsynctasksが交互に実行する必要があるために動作しますdoInBackgroundでループとは思わない、すなわちDownload.execute、Upload.execute、Download.execute、Upload.execute ...

ここでlogcatです:

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 

答えて

1

は、このコードをよく見てください:チェックボックスが初めて確認された場合

if (isChecked) { 
     while (isChecked) { 
      new Download.execute(); 
      new Upload.execute(); 
     } 
    } else { 
     // The toggle is disabled 
    } 

、あなたは無限ループに入力していますそれはメモリが足りなくなるまで、ダウンロードとアップロードの新しいインスタンスを作成し続けます。メインスレッドは、チェックボックスを再びチェックできるアイドル状態には決して入らない。

AsyncTaskで実行すると、AsyncTaskが別のスレッドで作業するようスケジュールされている間に即座に戻ります。 executeを呼び出すと、タスクが完了するのを待っていません。

+0

これは意味があります。これを実装する別のアイデアはありますか?ユーザーが停止するまでこれらのasynctaskをループする方法はありますか? –

+0

AsyncTaskはこれには適していません。作業を実行する異なるスレッドで実行されている2つの異なるサービスを考えてみましょう。アクティビティに必要なインタラクションの量に応じて実装するのは簡単ではありません。あなたがやっていることは、確かにアンドロイドアプリの典型的なケースではありません。 –

関連する問題