私は、その実行中に、AsyncTask
のカップルとThread
のカップルをキックオフするアクティビティを持っています。Android - スレッドを追跡する
これらの活動が破壊された時/再作成、その後のエラーのすべての種類は、私ができることを意味ArrayList<Thread>()
とArrayList<AsyncTask>()
に自分自身を追加するので、私の明るいアイデアは、各非UIスレッドが自身を登録することだった起こり続ける場合は、onDestroy()、これらのArrayListを反復処理し、そのようにそれらを破壊する:
@Override
public void onDestroy()
{
for(AsyncTask task : tasks)
task.cancel(true);*
for(Thread thread : threads)
thread.interrupt();
}
は、残念ながら、これは*でマークされた行にjava.util.ConcurrentModificationException
をスローします。私はそれぞれのfor
ループをsynchronize
ブロックにラップして、ArrayList
が他のどのThread
によっても変更されていないことを確認しました。
Do AsyncTask
s完了時に自分自身を破壊します(したがって、上記のエラーが発生します)。
誰かがAndroid環境でスレッドを制御するより良い方法を知っていますか? for(int i =0 : i < array.size() ; i++)
を使用するようにコードを変更する
EDIT
は、この問題を解決するようだが、私はまだ/それがなぜ起こるか/知っていただきたいと思います:、
synchronized(tasks)
{
for(int i=0; i < tasks.size(); i++)
tasks.get(i).cancel(true);
}
synchronized(threads)
{
for(int i=0; i < threads.size(); i++)
threads.get(i).interrupt();
}
私はセマフォなどでJavaスレッドと密接に通信するネイティブメソッドを実行しています。 – Graeme
そして、もはや走っていないときにdestroy()を呼び出すのと同じように「消えますか? – Graeme