HandlerThread 是什么?是一个Thread的子类,里面创建了一个Looper对象,并且调用Looper.loop();方法。

这个类通常用于创建子线程的handler,让其他线程通过handler#sendMessage()或者handler#postXXX()的方式,发送消息给HandlerThread,让这个线程去处理消息,执行操作,比如,访问网络等。

HandlerThread的使用以及原理 这篇写的比较清楚了。

可以看一下简单案例:

    private Looper looper;    private Handler mHandler;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_table);        HandlerThread handlerThread = new HandlerThread("sub-thread-create-by-cat");        handlerThread.start(); // 1. 启动一个 handlerThread 线程        looper = handlerThread.getLooper(); // 2. 获取该线程的 looper 对象        mHandler = new H(looper); // 3. 创建一个拥有该 looper 的 handler 对象        findViewById(R.id.btn_next)                .setOnClickListener(new View.OnClickListener() {                    @Override                    public void onClick(View v) {                        LogUtils.w("next...");//                        requestArticles();                        mHandler.sendEmptyMessage(123);//                        startActivity(new Intent(getActivity(), RoundActivity.class));                    }                });     }     protected class H extends Handler {        H(Looper looper) {            super(looper);        }        @Override        public void handleMessage(Message msg) {            // 4. 接收消息,执行逻辑            super.handleMessage(msg); // 可以处理耗时操作            // 也可以更新 Ui, 比如 toast ,windowManager            // todo: 但是不能更新当前 activity的 布局文件,因为只有创建view 的线程,才能操作 view ,具体 crush log 不记得了。            LogUtils.w(new Date() + " ### start---" + Thread.currentThread().getName());            Retrofit retrofit = new Retrofit.Builder()                    .baseUrl(HttpRequest.BASE_URL)                    .addConverterFactory(GsonConverterFactory.create())                    // 针对rxjava2.x//                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())                    .build();            WanService service = retrofit.create(WanService.class);            Call call = service.getBannerCall();            try {                 // 同步的网络请求                Response execute = call.execute();                LogUtils.w("io--->" + execute.body());                // toast ok                Toast.makeText(getApplicationContext(), "io->" + execute.body(), Toast.LENGTH_SHORT).show();                LogUtils.w(execute);//            tabView.setBackgroundColor(Color.RED); // crush                TextView tv = new TextView(getActivity());                tv.setBackgroundColor(Color.RED);                tv.setText("io->" + execute.body());                WindowManager wm = getWindowManager();                WindowManager.LayoutParams params = new WindowManager                        .LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,                        WindowManager.LayoutParams.WRAP_CONTENT);                params.type = WindowManager.LayoutParams.TYPE_APPLICATION_SUB_PANEL;                params.flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;//                params.token = this;                wm.addView(tv, params);            } catch (IOException e) {                e.printStackTrace();            }            LogUtils.w(new Date() + " ### end |||||||||||");        }    }

至于,为什么还可以更新 UI ,我。。。应该说 view 本身就没有规定只能在主线程更新,只要子线程更新需要满足跟主线程同样的条件,都可以更新了。(欢迎深究)

更多相关文章

  1. Android(安卓)AsyncTask两种线程池分析和总结
  2. 更新Android(安卓)SDK的小技巧
  3. Android中Context详解——你所不知道的Context
  4. android Watchdog 实现剖析
  5. android 自定义PickerView 日期滑动选择器
  6. Android网络应用(图片查看器)
  7. 自定义Dialog位置和大小
  8. Android:网络:多线程断点下载
  9. Android(安卓)第三方开源:Volley通过网络下载数据

随机推荐

  1. Android用Websocket实现聊天室
  2. 使用模拟器运行应用
  3. Android解析WindowManagerService(三)Windo
  4. python+appium自动化测试-元素定位之andr
  5. Android中Gravity中的一些值都是些什么意
  6. 【Android】 Painless Thread
  7. 【Android(安卓)安装包优化】资源混淆 (
  8. Android的Handler总结
  9. 一起Talk Android吧(第一百四十六回:Androi
  10. 2021最新Android笔试题总结美团Android岗