0

人々、私は Web サービスを使用していくつかのニュース項目をダウンロードする非同期タスクを持っています。これがその疑似です。

asynctask で実行する操作があります。Web サービスからいくつかのニュースをダウンロードします。

AsyncTask
{

AsyncTask(Context context){}

doInBackground()
{
 // download some news 
 ..
..
 return List<News>
}

onpostExecute(List <News>)
{
 is the activity around ? if yes then
  //find the list using context ,and populate it with news
}

}

私の質問は、デバイスが方向付けられている場合、操作中に新しい AsyncTask が発生することです。すでに進行中の古いものには、内部 List があります。

それはガベージコレクションになりますか?. 私はそれがないと思います。この状況に弱参照が適用されているという概念のにおいがしますが、ここで自分の鼻を信用することはできません。

また、weakreferences によって、この Async を生成したアクティビティがもう存在しないことを onPostExecute 内で知ることができます。しかし 。私はまだ多くのことを見逃していると信じています。

または、これは私が心配する必要はなく、リストは asynctask が終了すると自動的にガベージコレクションされますか?

4

2 に答える 2

0

スレッドがあります AsyncTask 本当に概念的に欠陥がありますか、それとも何か不足していますか?

簡単に言うと、Activity はMVC (Model-View-Controller) の観点からはControllerであり、データはModelに属します。そのため、そのような AsyncTasks をアクティビティから直接呼び出さないでください。

もう1つの書き込み:AsyncTask Missteps http://www.shanekirk.com/2012/04/asynctask-missteps/

于 2013-11-11T11:05:52.100 に答える
0

アクティビティが再作成されたため、新しいAsyncTaskものがあり、おそらく onCreate | でタスクを生成しています。スタート | onResume。

構成の変更時にアクティビティの再起動を無効にすることもできますが、これは注意が必要です。アクティビティが再開される可能性があると想定し、安全に実行できるように実装してください。

コンテキストをパラメーターとして渡しているため、タスクは静的内部クラスまたは独自のファイル内の外部クラスであると想定します。

このブログ投稿でアドバイスされているように、「アクティビティ」コンテキストの代わりに「アプリケーション」コンテキストを使用してみることができます

もう1つのオプションは、あなたが言ったように、コンテキストへのWeakReferenceを持つことです。

しかし、それ以外で重要なのは、これら 2 つのタスクが安全に同時に実行できるかどうかです。また、目に見えるアクティビティによって結果が消費されないことがわかっているときに、タスクを完了するまで実行することは、リソースの浪費です。アクティビティがシャットダウンしているときに現在のタスクをキャンセルします (onStop | onPause | onDestroy) が、これも注意が必要です (スレッドが中断されたらできるだけ早くキャンセルする目的で実装する必要があります。詳細はこちら: Android - AsyncTask を強制的にキャンセルします)。

最も確実な方法は、AsyncTask の代わりに Service を使用することです。

于 2013-11-11T10:54:43.660 に答える