回答は非常に高く評価されます。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
これは意味があります。これを実装する別のアイデアはありますか?ユーザーが停止するまでこれらのasynctaskをループする方法はありますか? –
AsyncTaskはこれには適していません。作業を実行する異なるスレッドで実行されている2つの異なるサービスを考えてみましょう。アクティビティに必要なインタラクションの量に応じて実装するのは簡単ではありません。あなたがやっていることは、確かにアンドロイドアプリの典型的なケースではありません。 –