在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 :
setResult(RESULT_OK);
TimerButtonActivity.this.finish();
break;
case :
mTimer1.setEnabled(false);
mTimer1.setText("已发送(" + String.valueOf(time) + ")");
break;
case :
mTimer1.setEnabled(true);
mTimer1.setText("重新获取验证码");
time = ;
break;
} }
};

发送消息的方法:

mHandler.sendEmptyMessage();

3、Handler Runnable

同样也是需要先创建一个线程。

 Handler handler = new Handler();

在一开始加载的地方使用postDelayed设置加载延迟

 handler.postDelayed(new Runnable() {
@Override
public void run() {
updataData();
}
}, );

或者我们要进行一个自动刷新的动作,当动作完成时,隐藏刷新效果

//开启一个刷新的线程
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();
}
}, );
}
});

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();
} 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);
}
}

最新文章

  1. Linux根文件系统分析之init和busybox
  2. 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
  3. 树莓派 连接wifi与路由器ip绑定
  4. Windows中explorer(图形壳)
  5. Dos学习笔记(2)dos屏幕内容的复制
  6. unittest可能面临的问题以及解决方法
  7. gulp 建立一个简单的自动化
  8. Android APK反编译得到Java源代码和资源文件
  9. redis实现与分析
  10. textarea中限制输入字符长度
  11. DatePickerDialog 控制只选择年月或年或月
  12. Java RMI(远程方法调用) 实例与分析 (转)
  13. jdk 安装配置
  14. 使用内链接(A a inner join B b on a.xx = b.xx)查询2个表中某一列的相同的字段。
  15. 关于View Link
  16. 201521123015 《Java程序设计》第10周学习总结
  17. [array] leetcode - 39. Combination Sum - Medium
  18. Redis数据结构之sds基本操作函数
  19. day 1:计算机发展史和组成部分
  20. PV原语操作详解

热门文章

  1. Scrum Meeting 汇总
  2. axiso 生产环境跨域配置(可用)
  3. (Android 即时通讯) [悬赏],无论是谁发现一个漏洞奖励人民币1000元!
  4. 关于禁止html缓存
  5. applets
  6. digestmd5.c:4037:15: error: #elif with no expression
  7. Unix/Linux文件类型及访问权限
  8. c++ 沉思录---代理类
  9. Elasticsearch使用BulkProcessor批量插入
  10. 判断浏览器 插件 jquery.ua.js