android之Handler的使用,回到主线程更新UI的四种方法
new Thread(new Runnable() { @Override public void run() { /* * handler使用步骤 *gei threadLocal设置了一个looper对象 * 在looper的构造方法中,创建了一个messageQueue对象 * */ Looper.prepare(); /*在构造方法中获取looper和looper中的messageQueue * * */ Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); } }; /*奖message发送到messagequeue中,在messageQueue里面,所有的message都是时间为顺序从小到大排列 * * */handler.sendEmptyMessage(0);/**顺序取出messageQueue中的message*并且执行message。target。dispatchMessage();其中的message。target就是发送这个消息的handler* 每一条消息都有一定的执行时间,handler会判断时间有没有到,如果没到时间会等待,* */Looper.loop(); } }).start();
----------handler的使用------
通过Message与Handler进行通信的步骤是:
1. 重写Handler的handleMessage方法,根据Message的what值进行不同的处理操作
2. 创建Message对象
虽然Message的构造函数式public的,我们还可以通过Message.obtain()或Handler.obtainMessage()来获得一个Message对象(Handler.obtainMessage()内部其实调用了Message.obtain())。
3. 设置Message的what值
Message.what是我们自定义的一个Message的识别码,以便于在Handler的handleMessage方法中根据what识别出不同的Message,以便我们做出不同的处理操作。
4. 设置Message的所携带的数据,简单数据可以通过两个int类型的field arg1和arg2来赋值,并可以在handleMessage中读取。
5. 如果Message需要携带复杂的数据,那么可以设置Message的obj字段,obj是Object类型,可以赋予任意类型的数据。或者可以通过调用Message的setData方法赋值Bundle类型的数据,可以通过getData方法获取该Bundle数据。
6. 我们通过Handler.sendMessage(Message)方法将Message传入Handler中让其在handleMessage中对其进行处理。
需要说明的是,如果在handleMessage中 不需要判断Message类型,那么就无须设置Message的what值;而且让Message携带数据也不是必须的,只有在需要的时候才需要让其携带数据;如果确实需要让Message携带数据,应该尽量使用arg1或arg2或两者,能用arg1和arg2解决的话就不要用obj,因为用arg1和arg2更高效。
Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what){ case 1: String str= (String) msg.obj; reponsedattx.setText(str); break; } };};
//get同步请求---http://ddb.cn/api/VlianbaoCash/deposit public void gettongbuDatasync(){ new Thread(new Runnable() { @Override public void run() { OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象 Request request = new Request.Builder() .url(String.valueOf(test.getText()))//请求接口。如果需要传参拼接到接口后面。 .build();//创建Request 对象 Response response=null; try { response = client.newCall(request).execute();//得到Response 对象 Log.e("kwwl","get同步res=="+response.body().string()); String resstr=response.body().string(); Message msg=new Message(); //虽然Message的构造函数式public的,我们也可以通过以下两种方式通过循环对象获取Message //msg = Message.obtain(uiHandler); //msg = uiHandler.obtainMessage(); //what是我们自定义的一个Message的识别码,以便于在Handler的handleMessage方法中根据what识别 //出不同的Message,以便我们做出不同的处理操作 msg.what = 1; //我们可以通过arg1和arg2给Message传入简单的数据 msg.arg2 = 321; msg.obj="jjjj"; //我们也可以通过给obj赋值Object类型传递向Message传入任意数据 //msg.obj = null; //我们还可以通过setData方法和getData方法向Message中写入和读取Bundle类型的数据 //msg.setData(null); //Bundle data = msg.getData(); //将该Message发送给对应的Handler handler.sendMessage(msg); } catch (IOException e) { e.printStackTrace(); } } }).start(); }
-------回到主线程更新UI的四种方法,参考:https://blog.csdn.net/mislaydu/article/details/51776247
更多相关文章
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- Android知识点总结(十五) Android(安卓)MVP 简易模型
- android BLE 4.0 setCharacteristicNotification接收不到数据
- Android(安卓)自定义ContentProvider和ContentObserver的完整使
- 【Android(安卓)应用开发】 自定义组件 宽高适配方法, 手势监听
- Android在任意位置由Notification跳向指定fragment
- Android(安卓)对话框(Dialog)