android的基础学习有段日子了,分享下自己比较迷惑的地方。

今天就写不同线程间的通讯问题吧。

首先呢了解编程中在不同线程间通讯时候会遇到的两个问题。

1> 在主线程做耗时操作的时候(比如下载数据),再对其它的组件操作时候会出现5秒未响应的ANR消息,这会对用户产生极其不好的印象~

2> 因为第一个问题,我们需要new 一个线程来操作,然后又引出了这第二个问题,在新线程更新主线程组件的时候会出现CalledFromWrongThreadException。

为了解决以上两个问题呢,就出现了Handler的技术, runOnUiThread(action); 还有一个AsyncTask;

Handler 有两个用法,一个是 handler.sendMessage(); 另一个是handler.post();

举例子吧:

handler.sendMessage(); 在新线程里可以这样写

Message msg = new Message();
Bundle data = new Bundle();
data.putInt("key",20); //能put各种类型~~键值对形式
msg.setData(data);
handler.sendMessage(msg);

然后再主线程里声明一个Handler,传参实现handleMessage(Message msg)

handler=new Handler(){
public void handleMessage(Message msg) {
int result = msg.getData().getInt();
}};

这样就可以实现通讯了~~

另一个是handler.post(); 例子:


Handler handler = new Handler();
handler.post(new Runnable() {
public void run() {
// 需要更新的数据
}
});

runOnUiThread(action); 这个很简单了 在新线程里直接调用就好~~~

AsyncTask技术~~

AsyncTask asyncTask = new AsyncTask<URL, Integer, String>() {
protected void onPreExecute() {
super.onPreExecute();
}


protected String doInBackground(URL... arg0) {

publishProgress(values);//这个方法不是必须的,但这个方法会触发onProgressUpdate(Integer... values)
return null;
}


@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}


@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
};

以上是AsyncTask的代码,不需要我们自己new 新的线程,需要实现的只有 protected String doInBackground(URL... arg0) {
return null;
}

其中 AsyncTask的三个泛型参数 是自己定的,一般第一个我们设置成URL;第二个可以是业务需要的值的类型,第三个可以是UI页面需要返回刷新的类型。 方法被调用的顺序是 先 onPreExecute() ; 可以用来得到组件。 然后是doInBackground(URL... arg0) :这个可以理解为Handler里我们在新线程里写的业务需要。onPostExecute(String result) 这里的result就是doInBackground() return的了~~~

这就是我的学习心得了~~

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. Android/Swing中并发分析
  3. Android实现聊天机器人之火影忍者
  4. Caused by: java.lang.IllegalStateException: Cannot pool recy
  5. android异常 android.os.NetworkOnMainThreadException
  6. ConstraintLayout使用心得以及几个需要注意的地方
  7. 获取mic音量大小
  8. android关于动画完成动作
  9. Android多线程--HandlerThread用法

随机推荐

  1. 我无法定义我的错误
  2. 节点js / Express替换LAMP
  3. 如何使用phpunit测试用例测试ajax调用?
  4. 在数据库中存储行数或动态获取
  5. 3-腿和2腿的auth有什么区别?
  6. 网站优化之PHPCMS如何开启伪静态
  7. 如何在php中的谷歌分析中显示搜索概述
  8. 如何为MySQL中包含记录的现有表创建唯一
  9. PHP 轻量级的PHP类检测移动设备(包括平板
  10. 从PHP登录请求获取空的AJAX响应