我对 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
@corsair992而找到的解决方案。
上面的代码在 HAXM Intel 模拟器、Nexus-5、API 级别 21 x86_64中运行(不知道 64 位是否相关,但让我们暂时假设它是相关的)。 我正在Android Studio中开发。
在@corsair992的评论提示下,我在Nexus-7 API Level 21 arm模拟器中运行了代码。 代码的行为正如您所期望的,正如海盗船所看到的那样。
接下来,我创建了一个具有相同规格的Nexus-5 ARM模拟器。 代码运行正确(未丢失任何消息)。
回到 HAXM 英特尔模拟器:错误代码。
所以,我想我现在的问题是:HAXM模拟器是否已知有问题? 有人可以试用该模拟器吗?