职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 325|回复: 1

总结4种线程中操作UI界面的方法

[复制链接]
曾经的小孩 发表于 2011-8-28 08:57 | 显示全部楼层 |阅读模式
我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据。但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的。下面总结4中方法用来在线程中操作UI界面。

方法一:Handler

子线程调用Handler的sendMessage(message)发送事件。

Java代码  
mHandler = new Handler() {   
   @Override  
   public void handleMessage(Message msg) {   
        //操作界面   
       myText.setText( 来自网络的信息);   
      super.handleMessage(msg);   
   }   
  };  

mHandler = new Handler() {
   @Override
   public void handleMessage(Message msg) {
        //操作界面
       myText.setText( 来自网络的信息);
      super.handleMessage(msg);
   }
  };
Java代码  
public class MyThread extends Thread {   
     public void run() {   
?    ?    ?    // 耗时操作   
?    ?    ?    ?loadNetWork();   
            Message msg = new Message();   
            mHandler.sendMessage(msg);//向Handler发送消息,   
      }   
}  

public class MyThread extends Thread {
     public void run() {
?    ?    ?    // 耗时操作
?    ?    ?    ?loadNetWork();
            Message msg = new Message();
            mHandler.sendMessage(msg);//向Handler发送消息,
      }
}
方法二:View.post(Runnable )

Java代码  
public void onClick( View v ) {   
        new Thread( new Runnable() {   
                public void run() {   
                       // 耗时操作   
?    ?    ?    ?    ?    ?      loadNetWork();   
?                          myText.( new Runnable() {   
                                  myText.setText( 来自网络的信息);   
                          });   
                 }   
        }).start();   
}  

public void onClick( View v ) {
        new Thread( new Runnable() {
                public void run() {
                       // 耗时操作
?    ?    ?    ?    ?    ?      loadNetWork();
?                          myText.( new Runnable() {
                                  myText.setText( 来自网络的信息);
                          });
                 }
        }).start();
}
方法三:Activity.runOnUiThread(Runnable )

与view.post类似

Java代码  
public void onClick( View v ) {   
        new Thread( new Runnable() {   
                public void run() {   
                       // 耗时操作   
?    ?    ?    ?    ?    ?      loadNetWork();   
?                         Activity.runOnUiThread.( new Runnable() {   
                                  myText.setText( 来自网络的信息);   
                          });   
                 }   
        }).start();   
}  

public void onClick( View v ) {
        new Thread( new Runnable() {
                public void run() {
                       // 耗时操作
?    ?    ?    ?    ?    ?      loadNetWork();
?                         Activity.runOnUiThread.( new Runnable() {
                                  myText.setText( 来自网络的信息);
                          });
                 }
        }).start();
}
方法四:AsyncTask

?
Java代码  
//UI线程中执行   
new DownloadImageTask().execute( "www.91dota.com" );  

//UI线程中执行
new DownloadImageTask().execute( "www.91dota.com" );
Java代码  
private class LoadTask extends AsyncTask {   
    protected String doInBackground( String... url ) {   
         return loadDataFormNetwork( url[0] );//后台耗时操作   
    }   
  
    protected void onPostExecute( String result ) {   
          myText.setText( result ); //得到来自网络的信息刷新页面   
  
   }  

private class LoadTask extends AsyncTask {
     protected String doInBackground( String... url ) {
          return loadDataFormNetwork( url[0] );//后台耗时操作
     }

     protected void onPostExecute( String result ) {
           myText.setText( result ); //得到来自网络的信息刷新页面

    }
}
更多android文章: 5进制空间


爱车车 发表于 2011-8-28 08:57 | 显示全部楼层
推荐链接
20-30万急聘多名天才Java/MTA软件工程师
见证又一个准百万富翁的诞生!

3G培训就业月薪平均7K+,不3K就业不花一分钱!

您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-27 19:13 , Processed in 0.119084 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表