5

私は本を​​通して学んでいます、そしてそれは私にこの例を与えます:

Handler handler=new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
        bar.incrementProgressBy(5); 
    } 
}; 

Thread background=new Thread(new Runnable() { 
    public void run() { 
        try { 
            for (int i=0;i<20 && isRunning.get();i++) { 
                Thread.sleep(500); 
                handler.sendMessage(handler.obtainMessage()); 
            } 
        } catch (Throwable t) { 
            // just end the background thread 
        } 
    } 
}); 

これはうまくいきます。しかし、本のさらに下には、次のように書かれています。

メッセージオブジェクトに煩わされたくない場合は、Runnableオブジェクトをハンドラーに渡すこともできます。ハンドラーは、アクティビティUIスレッドでそれらのRunnableオブジェクトを実行します。...任意のビュー(つまり、任意のウィジェットまたはコンテナー)で同じメソッドを使用できます。これにより、コードが少し単純化され、Handlerオブジェクトをスキップできるようになります。

Runnableしかし、オブジェクトを介してこれを行う方法の例はありません。誰か例がありますか?

4

2 に答える 2

5

このようなもの:

Handler h = new Handler();

Thread background=new Thread(new Runnable() { 
          public void run() { 
            try { 
              for (int i=0;i<20 && isRunning.get();i++) { 
                Thread.sleep(500); 
                handler.post(new Runnable() {
                  public void run() {
                    bar.incrementProgressBy(5);
                  }
                });
              } 
            } 
            catch (Throwable t) { 
              // just end the background thread 
            } 
          } 
        }); 
于 2011-07-24T04:29:28.620 に答える
2

ハンドラー用のAndroidドキュメントによると:

public final boolean post(Runnable r)

以来:APIレベル1により、Runnablerがメッセージキューに追加されます。ランナブルは、このハンドラーが接続されているスレッドで実行されます。パラメーター

r-実行されるランナブル。戻り値

Runnableがメッセージキューに正常に配置された場合はtrueを返します。通常、メッセージキューを処理しているルーパーが終了しているため、失敗するとfalseを返します。

于 2011-07-24T04:12:57.063 に答える