Android 消息处理程序未收到我发送的所有消息



我对 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模拟器是否已知有问题? 有人可以试用该模拟器吗?

相关内容

最新更新