为什么要使用的处理程序,同时runOnUiThread不一样吗?(Why to use Handle

2019-06-18 08:27发布

我所遇到的两个处理程序和runOnUiThread概念。 但对我来说似乎仍是一个疑问,作为事实它们有什么不同确切。

他们俩有尽而意从后台线程UI操作。 但是,什么是要考虑的,而我们在这两种方法中选择的因素。

例如,考虑一个Runnable Thread执行的背景web服务,现在我想更新UI。

什么是更新我的UI的最佳方式? 我应该去HandlerrunOnUiThread

我还知道我可以使用AsyncTask和利用onPostExecute 。 但我只是想知道其中的差别。

Answer 1:

Activity.runOnUiThread()是比较通用的一种特殊情况的处理程序 。 随着Handler ,你可以创建自己的线程中自己的事件查询。 使用Handlers与实例化默认的构造 并不意味着在一般的“ 代码将在UI线程上运行 ”。 默认情况下,处理程序绑定到Thread从他们是从实例化。

要创建Handler是保证绑定到UI(主)线程应该创建Handler绑定到主尺蠖这样的对象:

Handler mHandler = new Handler(Looper.getMainLooper());

此外,如果你检查的实施runOnuiThread()方法,它是利用Handler做的事情:

  public final void runOnUiThread(Runnable action) {
        if (Thread.currentThread() != mUiThread) {
            mHandler.post(action);
        } else {
            action.run();
        }
    }

正如你可以从上面的代码片段看, Runnable action将被立即执行,如果runOnUiThread()从UI线程调用。 否则,将其发布到Handler ,这将在某一时刻后执行。



Answer 2:

处理器有很多工作就像消息传递和频繁的UI更新,如果你启动一个线程任何运行的任务。一个处理程序允许您发送和处理信息,并与一个线程的MessageQueue ,,这是许多应用如蓝牙是非常有用的相关Runnable对象聊天,,无线上网聊天......和处理器具有与方法PostDelay和PostAtTime,通过它可以围绕任何观点发挥到动画和变化知名度等

你必须看看这个

http://developer.android.com/guide/components/processes-and-threads.html

http://developer.android.com/tools/testing/activity_testing.html



Answer 3:

继HitOdessit的答案。

您可以创建这样一个类。

public class Global{
    private static Handler mHandler = new Handler(Looper.getMainLooper());
    public static void runOnUiThread(Runnable action){
        mHandler.post(action);
    }
}

然后调用它。

Global.runOnUiThread(new Runnable(){
    //Your code
});

这可以从任何地方运行(在这里你可以访问您的全局类)。



Answer 4:

处理程序都做的东西的老办法(API等级1),然后AsycTask (API等级3)被推出,更加注重利用沿runOnUIThread (API等级1)。 您应该避免使用处理尽可能多的,而宁愿另两个根据您的需要。



Answer 5:

什么是更新我的UI的最佳方式? 我应该去处理程序或runOnUiThread?

如果您Runnable需要更新的用户界面,张贴在runOnUiThread

但它并不总是能够发布Runnable在UI线程。

想情况下,您要需要执行网络/ IO操作或调用Web服务的。 在这种情况下,你不能发布Runnable于UI线程。 它会抛出android.os.NetworkOnMainThreadException

这些类型的Runnable应该在不同的线程上运行一样HandlerThread 。 您完成操作后,您可以通过使用后结果返回给UI线程Handler ,其已与UI线程关联。

public void onClick(View view) {

    // onClick on some UI control, perform Network or IO operation

    /* Create HandlerThread to run Network or IO operations */
    HandlerThread handlerThread = new HandlerThread("NetworkOperation");
    handlerThread.start();

    /* Create a Handler for HandlerThread to post Runnable object */
    Handler requestHandler = new Handler(handlerThread.getLooper());

   /* Create one Handler on UI Thread to process message posted by different thread */

    final Handler responseHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            //txtView.setText((String) msg.obj);
            Toast.makeText(MainActivity.this,
                    "Runnable on HandlerThread is completed and got result:"+(String)msg.obj,
                    Toast.LENGTH_LONG)
                    .show();
        }
    };

    NetworkRunnable r1 = new NetworkRunnable("http://www.google.com/",responseHandler);
    NetworkRunnable r2 = new NetworkRunnable("http://in.rediff.com/",responseHandler);
    requestHandler.post(r1);
    requestHandler.post(r2);

}

class NetworkRunnable implements Runnable{
    String url;
    Handler uiHandler;

    public NetworkRunnable(String url,Handler uiHandler){
        this.url = url;
        this.uiHandler=uiHandler;
    }
    public void run(){
        try {
            Log.d("Runnable", "Before IO call");
            URL page = new URL(url);
            StringBuffer text = new StringBuffer();
            HttpURLConnection conn = (HttpURLConnection) page.openConnection();
            conn.connect();
            InputStreamReader in = new InputStreamReader((InputStream) conn.getContent());
            BufferedReader buff = new BufferedReader(in);
            String line;
            while ((line = buff.readLine()) != null) {
                text.append(line + "\n");
            }
            Log.d("Runnable", "After IO call:"+ text.toString());

            Message msg = new Message();

            msg.obj = text.toString();

            /* Send result back to UI Thread Handler */
            uiHandler.sendMessage(msg);


        } catch (Exception err) {
            err.printStackTrace();
        }
    }
}


文章来源: Why to use Handlers while runOnUiThread does the same?