android 子线程通过bundle、handler.sendMessage(message)向主线程传输多个类型数据,包括list

Android 端在进行耗时的网络连接或数据处理时,为了不影响主界面的实时响应(防止界面假死状态的发生),需要创建自定义子线程,如子线程处理后的数据需要传送至主界面(主ui线程中),可以选择handleMessage来实现:

1、在自定义函数中开辟一个子线程,并通过handler.sendMessage(message)发送消息给消息队列

public void自定义函数() {

    new Thread(new Runnable() {
        @Override
        public void run() {
            url=url1+"?"+url2;
            System.out.println("1");
            HttpGet request = new HttpGet(url);         
            HttpResponse reponse = null;
            try {
                reponse = new DefaultHttpClient().execute(request);
                System.out.println("3");
                //获取返回码,等于200即表示连接成功,并获得响应
                if(reponse.getStatusLine().getStatusCode()==200){
                 System.out.println("4");
                   String  result= EntityUtils.toString(reponse.getEntity());
                 Message message=new Message();
                 message.what=QURY_RESPONSE;
                 message.obj=result;//从服务器返回的数据
                 handler.sendMessage(message);//发送至主界面显示
                }else {
                    System.out.println("连接失败");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
}
2、在主ui线程中,实例化android.os.Handler对象,并从消息队列中取出从子线程压入的数据
 
  
private android.os.Handler handler=new android.os.Handler(){
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what){
            case QURY_RESPONSE:
                String getString= (String) msg.obj;
                try {
                    JsonToString(getString);//json解析后显示
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                break;
        }
    }
};
特别的,当传送的对象不但是String类型时,或者其他多个基本数据类型,或者List>类型的list时,则需要通过bundle集合来压入不同类型的object,子线程中部分代码如下:
                   Bundle bundle=new Bundle();
                   Message message=new Message();
                   ArrayList llist=new ArrayList();//ArrayList 继承自ParcelableArrayList
                   llist.add(mylist);//mylist是List>类型的对象
                   bundle.putParcelableArrayList("llist", llist);
                   bundle.putString("result", result);
                   bundle.putInt("position", position);
                   message.what=CHECKSTATE;
                   message.setData(bundle);
                   handler.sendMessage(message);
主线程handleMessage(Message msg) {...}中添加如下代码:
                case CHECKSTATE:
                   Bundle bundle=msg.getData();
                   ArrayList llist=bundle.getParcelableArrayList("llist");
                   final List> mylist= 
                                (List>) llist.get(0);//需要强制转换list类型
                   final int position =bundle.getInt("position");
                   String resultString =bundle.getString("result");
                 break;




你可能感兴趣的:(Android)