UI线程刷新数据 子线程延迟

tech2026-02-13  1

我们都知道耗时操作开子线程去操作,否则会导致主线程ANR

我遇到一种情况就是,我的主线程是Service,然后service里去弹出窗口,然后开子线程去进行耗时操作,耗时操作结束时,发送message给主线程来刷新弹窗内容。

可是我的服务会再次被调用onStartCommand ,再次弹窗并将上一次的弹窗顶掉,再开子线程,这时上一次的子线程结束时发送的message可能就发给了新的窗口,而发生错误。这时候只要确保一下发送消息的线程的id就好了。

private void ping_thread() { Thread thread = new Thread() { @Override public void run() { if (WifiManagerUtil.ping()) { Message message = new Message(); message.what = PING_IP_SUCCESS; message.obj = this.getId(); handler.sendMessage(message); } else { Message message = new Message(); message.what = PING_IP_FAIL; message.obj = this.getId(); handler.sendMessage(message); } super.run(); } }; cerrent_threadid = thread.getId(); thread.start(); } Handler handler = new Handler(Looper.getMainLooper()) { @Override public void handleMessage(Message msg) { switch (msg.what) { case PING_IP_SUCCESS: if (msg.obj != null) { if ((long) msg.obj == cerrent_threadid) { // --------------- // todo } } break; case PING_IP_FAIL: if (msg.obj != null) { if ((long) msg.obj == cerrent_threadid) { //rodo } } break; default: break; } } };

 

最新回复(0)