【问题标题】:why handleMessage run in ui thread While I created handler with background thread looper?为什么handleMessage在ui线程中运行而我用后台线程looper创建处理程序?
【发布时间】:2019-06-29 09:39:40
【问题描述】:

为什么handleMessage 在ui 线程中运行,而我使用后台线程looper 创建处理程序?这个looper不属于ui线程,但是alertdialog正确显示并且没有崩溃,同时应该给出一个错误。

如果问题不清楚,请原谅,因为我不太懂英语

public class ToastService extends Service {

    private HandlerThread thread;
    private Looper looper;
    ServiceHandler handler;
    public static int num=0;
    int idd=0;
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("say","created");
        thread=new HandlerThread("mhm", Process.THREAD_PRIORITY_BACKGROUND);
        thread.start();
        looper=thread.getLooper();
        handler=new ServiceHandler(looper);
    }

    @Override
        public int onStartCommand(Intent intent, int flags, int startId) {




        int messageIntent=0;
        if (intent!=null){
            messageIntent=intent.getIntExtra("myMessage",0);
            Log.i("sayonStartCommand",messageIntent+"");
        }

        Toast.makeText(this, "ook", Toast.LENGTH_SHORT).show();
        Message message=new Message();
        idd=messageIntent;
        message.what=0;
        message.arg1=startId;

        Bundle bundle=new Bundle();
        bundle.putInt("say",messageIntent);
        message.setData(bundle);

        handler.sendMessage(message);
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        Log.i("say","finish xxxxxxxxxxxxxxxxxx");
        super.onDestroy();
    }

    private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }
        @Override
        public void handleMessage(Message msg) {
           new AlertDialog.Builder(MainActivity.mcontext)
                .setTitle("ok")
                .setMessage("message").show();
            int i=msg.getData().getInt("say");
            Log.i("say",i+"");
            if (idd==3){
                stopSelf(msg.arg1);
            }
        }
    }
}

【问题讨论】:

  • 你找到解决办法了吗?
  • 很遗憾,我没有找到解决办法,也没有人知道原因。

标签: java android multithreading


【解决方案1】:

looper=thread.getLooper(); 这个looper 仍然在主线程上运行。所以用那个looper创建的Handler也在主线程中处理消息。

如果你想创建一个在后台线程中处理消息的Handler

 class LooperThread extends Thread {
      public Handler mHandler;

      public void run() {
          Looper.prepare();

          mHandler = new Handler() {
              public void handleMessage(Message msg) {
                  // process incoming messages here
              }
          };

          Looper.loop();
      }
  }

【讨论】:

  • looper=thread.getLooper();这个 looper 仍然在主线程上运行!!!!但是looper属于后台线程 其实looper属于HandlerThread 已经启动了 那么它是如何运行在ui线程上的呢?
  • 如果你尝试调试它。您会看到 looper 的值中有 main
猜你喜欢
  • 2013-07-23
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2019-09-10
相关资源
最近更新 更多