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

时间:2015-01-11 20:44:48

标签: android multithreading handler message-queue

我对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

1 个答案:

答案 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模拟器是否有问题?有人可以试试那个模拟器吗?