0

Android のメイン UI スレッドはスリープを呼び出すべきではないことを読みました。

ただし、私のアプリケーションは次のことを行う必要があります。

  1. メイン UI スレッドから thread1 を呼び出す
  2. メイン UI スレッドから thread2 を呼び出します。

2 スレッドの出力 (2 つの画像) を使用し、それらを追加してから表示します。

メインスレッドがスレッド1とスレッド2が完了するまで待機するように、Thread.sleep()を使用しています。ただし、メインスレッドで呼び出した後 (スリープ後)、mImageview.setbitmap が機能しません。

これをどのように行うべきか教えていただけますか?

4

4 に答える 4

1

Androidでのマルチスレッドは、非同期で実行する必要があります。この目的のために、AsyncTask-classを使用する必要があります。

あなたの場合、例えば、これらの2つの画像をロード(または処理)するためのタックを作成します。プロセスが実行されている間(別のスレッドで、UIスレッドから離れて)、ProgressBarアプリケーションが現在ビジーであることをユーザーに示すことができます(これはUIスレッドで実行されます)。

タスクが終了すると、タスクから結果(2つの画像)を取得し、進行状況バーを非表示にして、すべてをユーザーに表示します。

反応しないGUIは常にアプリケーションがフリーズしているように感じますが、UIスレッドが5秒以上ブロックされている場合(これは非常に長い時間です)、アプリケーションは強制的に閉じられます。反応する」(そしてANRが上がる)。

于 2012-04-10T10:51:45.963 に答える
0

ExecutorServiceを使用することをお勧めします。これがその方法です

  1. 2つの画像読み込みアクティビティを実行可能タスクとして作成します。
  2. ExecutorServiceでそれらを実行します。
  3. 使用ExecutorService.awaitTermination(); メインスレッドが実行可能タスクの完了を待機するため。そのドキュメントには次のように書かれています

シャットダウン要求後にすべてのタスクの実行が完了するか、タイムアウトが発生するか、現在のスレッドが中断されるまで、どちらか早い方でブロックします。

これは非同期の方法であり、私はそれを好むべきだと思います。

于 2012-04-10T13:24:51.320 に答える
0

Thread.Sleep()だけではありません。GUIスレッドで、2つのスレッド/タスクなどを開始するために必要なことをすべて実行してから、イベントハンドラーを終了します。

GUIイベントハンドラーで待たないでください!Java、C ++、C、Delphiなどではありません。非同期タスクまたはハンドラーを使用して、GUIスレッドにシグナルを送信します。スレッド1は完了したことを通知し、スレッド2は完了したことを通知します。いずれの場合も、データが他のスレッドから返されたかどうかを確認してください。含まれている場合は、返されたデータの両方のセットがあるため、それらを追加して表示できます。

GUIイベントハンドラーで待機しないでください。

于 2012-04-10T10:59:32.013 に答える
0

この目的には、単にスレッドとハンドラーを使用できます。これは、このための小さなデモです。

このように onCreateでハンドラーを作成します。

Drawable d=null;    

Handler handler=new Handler()
{

public void handleMesaage(Message msg)
{
   if(msg.what==0)
{
   imageView.setBackgroundDrawable(d);
}

}

};

そして今、あなたのスレッドをこのように呼び出します。

Thread t=new Thread(new Runnable()
{
@Override
public void run() {
   InputStream is = (InputStream) new URL(url).getContent();
   d = Drawable.createFromStream(is, "src name");
    handler.sendEmptyMessage(0);
}
});t.start();
于 2012-04-10T11:51:38.480 に答える