我对Android编程及其相关的消息模型很陌生,但是基于我看到的所有代码示例,我得不到期望的结果。
我正在尝试从线程传递消息回UI线程,以便更新我的UI。下面的示例代码试图抽象出这个问题。我有一个在UI中设置为接收消息的处理程序,以及一个线程类,该线程发送具有计数器的消息,休眠一秒钟,增加计数器并发送另一个消息。问题在于,我看到发送者线程发送的消息永远不会被接收。有时它们会被接收 - 并且持续很长时间。然后发送了一堆并且丢失了。然后它们再次被接收。
之前的一个问题暗示我应该使用dispatchMessage而不是sendMessage - 这实际上是有效的(!) ,但显然不是做事情的适当方式,sendMessage应该起作用。
那么,我错过的非常明显的事情是什么呢? :-)
这是活动:
package org.foo.testapp;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
public class MainActivity extends ActionBarActivity {
Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message inputMessage) {
System.out.println("HANDLE: " + inputMessage.obj);
// Looper.loop(); This doesn't seem to matter either way
}
};
}
public void startEverything(View v) {
System.out.println("Button clicked");
TestMessage tm = new TestMessage(mHandler);
Thread tmthread = new Thread(tm);
tmthread.start();
}
}
这里是发送消息的线程:
package org.foo.testapp;
import android.os.Handler;
import android.os.Message;
public class TestMessage implements Runnable { Handler mHandler;
int foo;
TestMessage(Handler inputHandler) {
mHandler = inputHandler;
foo = 0;
}
public void run() {
while(true) {
foo = foo + 1;
Message msg = mHandler.obtainMessage();
msg.obj = "SENDING " + foo;
System.out.println("SENDING " + foo);
//mHandler.sendMessage(msg); this loses messages
if(!mHandler.sendMessage(msg)) {
System.out.println("Error sending!");
}
//mHandler.dispatchMessage(msg);
try {
Thread.sleep(1000);
} catch(InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
}
使用sendMessage方法时,我得到的输出结果如下(实际输出可能会有所不同)。
Button clicked
SENDING 1
HANDLE: SENDING 1
SENDING 2
HANDLE: SENDING 2
SENDING 3
HANDLE: SENDING 3
SENDING 4
HANDLE: SENDING 4
SENDING 5
SENDING 6
SENDING 7
SENDING 8
SENDING 9
SENDING 10
SENDING 11
SENDING 12
SENDING 13
SENDING 14
SENDING 15
SENDING 16
SENDING 17
SENDING 18
SENDING 19
SENDING 20