У меня есть основной интерфейс, и у меня запущен AsyncTask. Я хочу связаться с AsyncTask, чтобы он выполнял что-то в потоке, не являющемся пользовательским интерфейсом. Итак, я попытался сделать следующее:
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 () фактически выполняется в потоке пользовательского интерфейса. Я знаю это, потому что runCommand () блокируется на 5 секунд, а мой пользовательский интерфейс перестает отвечать на запросы в течение 5 секунд.
Почему handleMessage () не работает в потоке без пользовательского интерфейса? Есть ли какой-то другой предпочтительный способ связи между потоками?