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