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的了~~~
这就是我的学习心得了~~
转载于:https://blog.51cto.com/1967172/654445