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;
}
}
这个构造非常特别的一点是没有创建任何垃圾(*)。垃圾收集器上没有单个shotRunnable
实例。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;
}
}