这里有新鲜出炉的精品教程,程序狗速度看过来!
Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。
本篇文章主要介绍了浅谈Android中使用异步线程更新UI视图的几种方法,具有一定的参考价值,有兴趣的可以了解一下
在Android中子线程是不能更新ui的。
所以我们要通过其他方式来动态改变ui视图,
1、runOnUiThread
activity提供的一个轻量级更新ui的方法,在Fragment需要使用的时候要用getActivity.runOnUiThread开启线程
这种方法最简单,方便更新一些不需要判断的通知,比如在聊天项目中动态获取未读消息数量。
- runOnUiThread(new Runnable() {
- @Override
- public void run() {
- sendMessage("[自动回复]你好,我是机器人");
- }
- });
2、Handler message
使用这个方法可以设置比如按钮倒计时的控制,也是比较常见的一种更新ui的方法。
创建一个主线程用于接收子线程不断发送的消息,通过msg.what判断传递的消息类型。
根据类型进行相关ui的更新操作。
创建线程用于接收:
- private Handler mHandler = new Handler() {
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case 0:
- setResult(RESULT_OK);
- TimerButtonActivity.this.finish();
- break;
- case 4:
- mTimer1.setEnabled(false);
- mTimer1.setText("已发送(" + String.valueOf(time) + ")");
- break;
- case 5:
- mTimer1.setEnabled(true);
- mTimer1.setText("重新获取验证码");
- time = 10;
- break;
- }
- }
- };
发送消息的方法:
- mHandler.sendEmptyMessage(5);
3、Handler Runnable
同样也是需要先创建一个线程。
- Handler handler = new Handler();
在一开始加载的地方使用postDelayed设置加载延迟
- handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- updataData();
- }
- }, 2000);
或者我们要进行一个自动刷新的动作,当动作完成时,隐藏刷新效果
- //开启一个刷新的线程
- mFragmentMainRf.post(new Runnable() {
- @Override
- public void run() {
- //开始
- mFragmentMainRf.setRefreshing(true);
- }
- });
- //监听刷新状态操作
- mFragmentMainRf.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
- @Override
- public void onRefresh() {
- //设置延迟刷新时间1500
- handler.postDelayed(new Runnable() {
- @Override
- public void run() {
- //刷新数据
- updataData();
- }
- }, 1800);
- }
- });
4、AsyncTask
AsyncTask可以更加轻松地使用UI线程。该类允许执行后台操作并在UI线程上更新视图,而不需要操纵线程和处理程序。
AsyncTask被设计为一个辅助类Thread,Handler 并且不构成通用线程框架。用于短时间更新操作。
在使用的时候需要继承AsyncTask并重写方法:
doInBackground:用于返回结果
onProgressUpdate: onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作
onPostExecute:接收doInBackground的返回结果,用于更新UI
- class AsyncTaskWrapper extends AsyncTask < Void,
- Integer,
- Object > {
- @Override protected Object doInBackground(Void...voids) {
- try {
- Thread.sleep(2000);
- } catch(InterruptedException e) {
- e.printStackTrace();
- }
- return null;
- }
- @Override protected void onProgressUpdate(Integer...values) {
- super.onProgressUpdate(values);
- Log.e("Progress", valuse);
- }
- @Override protected void onPostExecute(Object o) {
- super.onPostExecute(o);
- Log.e("Message", o);
- }
- }
来源: http://www.phperz.com/article/17/0912/345749.html