android handlerThread 的使用
16lz
2021-01-26
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 本身就没有规定只能在主线程更新,只要子线程更新需要满足跟主线程同样的条件,都可以更新了。(欢迎深究)
更多相关文章
- Android(安卓)AsyncTask两种线程池分析和总结
- 更新Android(安卓)SDK的小技巧
- Android中Context详解——你所不知道的Context
- android Watchdog 实现剖析
- android 自定义PickerView 日期滑动选择器
- Android网络应用(图片查看器)
- 自定义Dialog位置和大小
- Android:网络:多线程断点下载
- Android(安卓)第三方开源:Volley通过网络下载数据