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的了~~~

 

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