0

私は最近、特に Java と Android を使用した並行プログラミングに参加しています。

ハンドラーについていくつか質問があります。1 - Handler をスレッドに関連付ける必要があることがわかっており、それが呼び出されたスレッドで実行されます。ただし、SO のいくつかの例では、ユーザーは次のことを行っています。

public class MainActivity extends Activity 
{
private Handler handler = new Handler();

@Override
public void onCreate(Bundle savedInstanceState)
{ 
 handler.postDelayed(runnable, 1000);
}


    private Runnable runnable = new Runnable()
{
    public void run()
    {
        //Do whatever
        handler.postDelayed(this, 30000);
    }
};

この例では、UI スレッドで Handler を実行していると仮定していますね。

の代わりにここでネットワーク操作を行うことはできます//DO Whateverか? 私たちはメインスレッドにいるので、そうは思いません。

これは無意味ですか?AsyncTask を使用してこのタスクを置き換えることができますか?

この同じ例をUIスレッドではなく別のスレッドに適用するにはどうすればよいですか?

スレッドまたは Runnables には、投稿の遅延に似たものがありますか?

postdelayed 機能のためだけにハンドラーを使用し、メインタスクハンドラーが作成されていない、つまり、スレッドと UI/Activity の間の仲介者であることは一般的ですか?

4

2 に答える 2

0

ハンドラーは、UI を更新する場合にのみ役立ちます。ご存知かもしれませんが、非 UI スレッドから UI を更新することはできません。バックグラウンド スレッドでネットワーク処理を行ってから UI を更新する場合は、Handler クラスまたは AsyncTask を使用するか、次のようにする必要があります。

(非 UI スレッドから)

SomeView.post(new Runnable() {
   //updating UI
});
于 2013-09-19T11:54:42.610 に答える
0

何をしていても「重い」場合は、スレッドで実行する必要があります。独自のスレッドで明示的に開始しない場合は、メイン (UI) スレッドで実行されますが、ユーザーによっては、ぎくしゃくしたり、インターフェイスの応答が遅くなったりすることがあります。

興味深いことに、スレッドを使用している場合、開始しようとしているワーク スレッドとメイン スレッドとの間の通信手段として Handler も使用すると便利なことがよくあります。

典型的なスレッド/ハンドラーの相互作用は次のようになります。

Handler h = new Handler(){
@Override
public void handleMessage(Message msg){
    if(msg.what == 0){
        updateUI();
    }else{
        showErrorDialog();
    }
}};

Thread t = new Thread() {
@Override
public void run(){
    doSomeWork();
    if(succeed){
        //we can't update the UI from here so we'll signal our handler and it will do it for us.
        h.sendEmptyMessage(0);
    }else{
        h.sendEmptyMessage(1);
    }
}   };

ただし、一般的には、実行時間の長い作業や非常に集中的な作業 (ネットワーク、ファイル IO、負荷の高い演算など) を行うときはいつでも、スレッドを使用する必要があります。

于 2016-05-09T06:31:42.777 に答える