Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 主活套vs runOnUiThread_Java_Android_Multithreading - Fatal编程技术网

Java 主活套vs runOnUiThread

Java 主活套vs runOnUiThread,java,android,multithreading,Java,Android,Multithreading,我对安卓的世界还不熟悉。下面的方法和我应该在主线程上运行方法的方法有什么区别 (一) (二) 从活动的源代码: public final void runOnUiThread(Runnable action) { if (Thread.currentThread() != mUiThread) { mHandler.post(action); } else { action.run(); } } 您可以看到,rununuithread做了

我对安卓的世界还不熟悉。下面的方法和我应该在主线程上运行方法的方法有什么区别

(一)

(二)


从活动的源代码:

public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
}
您可以看到,
rununuithread
做了几乎相同的事情,即在
处理程序上发布一个
Runnable
。主要区别在于,如果您已经在ui线程上调用它,那么它将直接运行

我将使用第二个,因为当您可以使用
活动
中的一个时,无需创建另一个处理程序

第一种情况是当您手边没有
活动
视图
可以发布
可运行
(例如在
服务
中)时使用


另外,您会注意到
Handler
的默认构造函数使用当前线程的
Looper
,这意味着如果您从UI线程创建
Handler
,则不必获取mainLooper,没有真正的区别,你可以用更短的符号。然而,有一个相关的结构存在很大的差异:

public class MyActivity extends Activity implements Handler.Callback {

     // constructors and onCreate and stuff

    private static final int FOO = 1;
    private static final int BAR = 2;

    private final Handler mHandler = new Handler(Looper.getMainLooper(), this);

    private void sendFooMessage(int arg1, String arg2) {
        mHandler.sendMessage(mHandler.obtainMessage(FOO, arg1, 0, arg2));
    }

    @Override
    public boolean handleMessage(Message msg) {
        switch(msg.what) {
        case FOO:
             //handle the foo event
             return true;
        case BAR:
             //handle the bar action
             return true;
        }
        return false;
    }
}
这个构造非常特别的一点是没有创建任何垃圾(*)。垃圾收集器上没有单个shot
Runnable
实例。
Handler.obtainMessage(…)
方法从一个池中获取
Message
对象,在这个池中它们被一次又一次地重用

如果您在保持60fps很重要的情况下触发消息,这种无垃圾结构可以防止垃圾收集器暂停,从而有助于保持一切顺利进行


*)不管怎么说,不是消息本身,您仍然需要注意args和其他内容。

如果您查看活动的源代码,您会发现
runOnUiThread
做了几乎相同的事情,只是如果您已经在ui线程上调用它,它会直接运行。我将使用第二个,因为没有必要创建另一个handler@njzk2你为什么不把它作为一个答案呢?也许有一段源代码。
public final void runOnUiThread(Runnable action) {
    if (Thread.currentThread() != mUiThread) {
        mHandler.post(action);
    } else {
        action.run();
    }
}
public class MyActivity extends Activity implements Handler.Callback {

     // constructors and onCreate and stuff

    private static final int FOO = 1;
    private static final int BAR = 2;

    private final Handler mHandler = new Handler(Looper.getMainLooper(), this);

    private void sendFooMessage(int arg1, String arg2) {
        mHandler.sendMessage(mHandler.obtainMessage(FOO, arg1, 0, arg2));
    }

    @Override
    public boolean handleMessage(Message msg) {
        switch(msg.what) {
        case FOO:
             //handle the foo event
             return true;
        case BAR:
             //handle the bar action
             return true;
        }
        return false;
    }
}