2012-04-10 14 views
0

私はアンドロイドのメインUIスレッドがsleepを呼び出すべきではないことを読んだ。メインUIスレッドからメインUIスレッドから 他のスレッドが実行されるのを待っているUIスレッド - 動作していない

  • 呼び出しスレッド2を

    1. 呼び出しスレッド1:

      はしかし、私のアプリケーションは次の必要があります。

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

    私は、スレッドが完了するまでメインスレッドがthread1とthread2を待つようにThread.sleep()を使用しています。しかし、mImageview.setbitmapはメインスレッド(スリープ後)で呼び出した後は動作しません。

    私はこれをどうすればよいのですか?

  • 答えて

    1

    Androidでのマルチスレッドは非同期で行う必要があります。このためにはAsyncTask-classを使用してください。

    あなたの場合、たとえば、2つの画像を読み込む(または処理する)タクを作成します。プロセスが実行中(別のスレッドではUIスレッドから)、アプリケーションに現在ビジー状態であることを示すProgressBarを表示することができます(これはUIスレッドで行われます)。

    タスクが終了すると、タスクから結果(2つのイメージ)が取得され、進行状況バーが非表示になり、すべてがユーザーに表示されます。

    非反応のGUIは常にアプリケーションがフリーズする感覚を持っていますが、UIスレッドが5秒以上ブロックされると(ルーオン時間)、アプリケーションは強制終了されますそれは "反応する"ではありません(そしてANRが提起されます)。

    +0

    イベントハンドラで待っていると、「浮動小数点比較が失敗しました」と「スレッドを停止するにはどうすればよいですか?」というメッセージが表示されます。 : –

    +0

    別のもの - GUIがブロックされていると、「操作をキャンセルする」ボタンがないことがあります。間違って起動したことを止めることができない場合、ユーザーには非常にイライラしています。 ' –

    +0

    @MartinJamesあなたは 'AsyncTask'を取り消すことができます。これは、ボタンまたは"戻る "キーで実装できます。 –

    0

    これは単なるThread.Sleep()ではありません。 GUIスレッドでは、2つのスレッド/タスク/何かを開始してから、イベントハンドラを終了するために必要な処理を行います。

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

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

    0

    この目的のためにスレッドとハンドラを使用するだけで済みます。ここ は、私がお勧めし

    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(); 
    
    0

    、このようなあなたのonCreateで

    Drawable d=null;  
    
    Handler handler=new Handler() 
    { 
    
    public void handleMesaage(Message msg) 
    { 
        if(msg.what==0) 
    { 
        imageView.setBackgroundDrawable(d); 
    } 
    
    } 
    
    }; 
    

    ハンドラを作成し、次のようにあなたのスレッドを呼び出し、このための小さなデモですExecutorServiceを使用してください。ここにある方法

    1. 2つの画像読み込みアクティビティを実行可能タスクとして作成します。
    2. ExecutorServiceを使用してそれらを実行します。
    3. ExecutorService.awaitTermination()を使用してください。メインスレッドがRunnableタスクが完了するのを待つ。すべてのタスクがシャットダウン 要求した後、実行を完了した、またはタイムアウトが発生した場合、または現在のスレッドが中断され、いずれか早い方 まで、そのドキュメントは

    ブロックを読み込みます。

    これはこれを実行するアシンクの方法であり、私はそれが望ましいと思います。