android - 与 AsyncTask 线程通信?处理程序不工作?

标签 android multithreading communication android-asynctask

我有我的主 UI,并且有一个 AsyncTask 正在运行。我想与 AsyncTask 通信,让它在非 UI 线程上运行一些东西。所以我尝试做的是:

protected class WifiMon extends AsyncTask<Context, Integer, String>
{
    Context parent;
    CoexiSyst coexisyst;
    private static final String WIMON_TAG = "WiFiMonitor";
    private int PCAP_HDR_SIZE = 16;
    private int _scan_pkts_left;

    public Handler _handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {

            // We invoke a scan, and then read in all of the packets
            // captured from the scan.
            if(msg.obj == ThreadMessages.WIFI_SCAN_START) {
                Log.d(TAG, "Got message to start Wifi scan");
                int start_rxpkts = getRxPacketCount();
                runCommand("/data/data/com.gnychis.coexisyst/files/iw dev wlan0 scan");
                _scan_pkts_left = getRxPacketCount() - start_rxpkts;
                Log.d(TAG, "Finished Wifi scan");
            }
        }
    };
  ...
}

但是,似乎当收到传入消息时,handleMessage() 实际上在 UI 线程中运行。我知道这是因为 runCommand() 阻塞了 5 秒,而我的 UI 最终无响应了 5 秒。

为什么 handleMessage() 不在非 UI 线程上运行?线程之间是否还有其他首选通信方式?

最佳答案

doInBackground() 方法中创建处理程序对象。
或者
如果它独立于 Aysnctask,您可以将处理程序放在单独的线程中。

编辑:

mHandlerThread = new HandlerThread("some_name");
mHandlerThread.start();

/* we need to wait to get the looper instance */
while(!mHandlerThread.isAlive()) {};  
mHandler = new Handler(mHandlerThread.getLooper(), null);

关于android - 与 AsyncTask 线程通信?处理程序不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7225893/

相关文章:

android - 为什么 BitmapFactory 将我的图像缩小 1.333 倍而不是 2 倍?

java - 多个线程怎么可能只有一个servlet实例?

Javascript 窗口写入回调

java - 套接字认证服务器?

android - addView() 之后的 "resultIndex is -1, the polygon must be invalid!"

java - Android 中 String.join 的替代方案?

java - 了解gradle.properties和java-opts

c# - 多线程 .NET 应用程序导致在 64 位四核 Windows Server 上运行的 KERNEL32.dll 中出现应用程序错误

c# - 异步函数完成得太早

c# - 从 MainViewModel 调用 ViewModel 的方法