2

AsycnTask の次のコード:

@Override
protected Boolean doInBackground(View... params) {

try{

    Drawable drawPhoto = DataDatero.ImageDownload(taskPhotoName);
    ((ImageView)params[0]).setImageDrawable(drawPhoto);
    ((TextView)params[1]).setText(taskItemListText);
    ((TextView)params[2]).setTextColor(taskColore);
    ((TextView)params[2]).setText(taskItemStockText);
    [...]
}

次のことを説明する CalledFromWrongThreadException をスローします。

ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます

これは多くの質問で議論されてきました: example , another example ; そして全員が同じ結論に達します。

しかし、私は例外を取得しているだけではありません..

List アダプタのgetViewから実行すると、テキストの例外がスローされている間、ビューで画像 (params[0]) が更新されます。また、 textview updates だけを残すと、テキストが更新され、例外はスローされません。

最初に TextView を更新し、後で ImageView を更新すると、一部のテキストと画像は更新されますが、一部の画像は更新されません (その imageDownload には 2 ~ 3 秒のネットワーク操作が含まれます)。

それらのいくつかは更新され、他のものは更新されないのはなぜですか?

注: これは、api 16 エミュレーションで、sdk 4.0、v4 サポートでのみテストされました。私はそれを修正し、doInBackground のビューには触れていません。

4

4 に答える 4

0

例外は明らかです。UIとは異なるスレッドから要素を更新することはできませんUI ThreaddoInBackground別のスレッドでコードを実行する

于 2012-12-14T16:42:23.127 に答える
0

UI を更新するための情報をメソッドに渡せないのはなぜonPostExecuteですか? これは、UI が更新される予定の場所です。

于 2012-12-14T16:43:13.440 に答える
0

executeタスクのメソッドを実行すると、doInBackgroundメソッドはバックグラウンド スレッドで実行されます。

また、バックグラウンド スレッドから UI を変更することはできません。

doInBackgroundそのため、メソッドで UI を変更しないでください。

onPostExecute代わりに、UI スレッドで実行されることが保証されているメソッドでこの UI を実行する必要があります。

于 2012-12-14T16:43:40.283 に答える