0

いくつかのスレッドを開始し、ネットからデータを取得し、それを使用していくつかのアクションを実行してから、このデータに関するUIを変更したいと思います。

エグゼキュータサービスを使用しています

executorService = Executors.newFixedThreadPool(3);

すべてのデータが取得されますが、imageView.postを呼び出そうとすると、trueが返されますが、Runnableに関する本体は実行されません。

Log.v("imageloader", "before post + " + imageView);
imageView.post(new Runnable()
{
    @Override
    public void run()
    {
         Log.v("imageloader", "in post - " + bmpToShow.toString() + "/" + imageView);
         if (imageView.getTag().equals(url))
         {
             imageView.setImageBitmap(bmpToShow);
         }
    }
});

このエグゼキュータサービスで10個のRunnablesをログで実行すると、10個の「投稿前」メッセージが見つかりますが、「投稿中」メッセージではnTasks( "Executors.newFixedThreadPool(nTasks)"で許可するタスクの数によって異なります)のみです。

nTasksがview.postの実行数とどのように関連しているか理解できません。

PS。これは、アプリの最初の起動時にのみ発生します(Androidフラグメントを使用し、onCreateViewにデータを入力します)

4

2 に答える 2

2

うわー、問題は場合によっては(それが何に依存するかわからない)ImageView.postのコードが実行されなかった(おそらくこのビューはまだ作成されていない)、runOnUiThread()でImageview.post()を変更し、すべてが機能するようになりました。

于 2012-07-05T06:11:37.267 に答える
1

posttrueを返すことは、Runnableが正常にキューに入れられたことを意味するだけであり、正常に実行されたことを意味しません。

「ランナブルの本体が実行されていない」ことをどうやって知っていますか?

1つの可能性はbmpToShownullである可能性があります。その場合、ログステートメントはおそらくNullPointerException(Androidでログがどのように機能するかわからない)をスローし、キャッチしないと失われます。

別のログを追加して、ランナブルを入力するときに最初にそれを確認できますLog.v("in runnable with " + bmpToShow);

nullの場合bmpToShow、いくつかの理由が考えられますが、残りのコードを見ずに判断するのは困難です。

于 2012-07-02T12:17:04.010 に答える