Chinaunix首页 | 论坛 | 博客
  • 博客访问: 331929
  • 博文数量: 45
  • 博客积分: 669
  • 博客等级: 上士
  • 技术积分: 675
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-27 17:59
文章分类
文章存档

2015年(5)

2014年(6)

2013年(4)

2012年(30)

分类: Android平台

2015-04-11 10:55:55

        Android UI主线程为了保证响应用户的及时性,拒绝在UI主线程中进行连接网络或者读取大型文件等耗时的操作。提供了AsyncTask,创建后台线程进行网络读取等耗时操作。AsyncTask提供了一系列的方法和接口来与主线程进行数据交互,并更新UI界面。
   AsyncTask的构造函数有三个模板参数:
       1.Params,传递给后台任务的参数类型。
       2.Progress,后台计算执行过程中,进步单位(progress units)的类型。(就是后台程序已经执行了百分之几了。)
       3.Result, 后台执行返回的结果的类型。
AsyncTask并不总是需要使用上面的全部3种类型。标识不使用的类型很简单,只需要使用Void类型即可。

AsyncTask抽象出后台线程运行的五个状态,分别是:1、准备运行,2、正在后台运行,3、进度更新,4、完成后台任务,5、取消任务,对于这五个阶段,AsyncTask提供了五个回调函数:

  1、准备运行:onPreExecute(),该回调函数在任务被执行之后立即由UI线程调用。这个步骤通常用来建立任务,在用户接口(UI)上显示进度条。
  2、正在后台运行:doInBackground(Params...),该回调函数由后台线程在onPreExecute()方法执行结束后立即调用。通常在这里执行耗时的后台计算。计算的结果必须由该函数返回,并被传递到onPostExecute()中。在该函数内也可以使用publishProgress(Progress...)来发布一个或多个进度单位 (units of progress)。这些值将会在onProgressUpdate(Progress...)中被发布到UI线程。
  3. 进度更新:onProgressUpdate(Progress...),该函数由UI线程在publishProgress(Progress...)方法调用完后被调用。一般用于动态地显示一个进度条。
  4. 完成后台任务:onPostExecute(Result),当后台计算结束后调用。后台计算的结果会被作为参数传递给这一函数。
  5、取消任务:onCancelled (),在调用AsyncTask的cancel()方法时调用。
      以下是一个简单的例程,点击按钮,创建一个后台AsyncTask线程,读取网络数据,在读取数据完成之后,在AsyncTask的onPostExecute方法执行UI的更新操作。

点击(此处)折叠或打开

  1. public class MainActivity extends Activity {

  2.     
  3.     private TextView tView;
  4.     @Override
  5.     protected void onCreate(Bundle savedInstanceState) {
  6.         super.onCreate(savedInstanceState);
  7.         setContentView(R.layout.activity_main);

  8.         tView=(TextView) findViewById(R.id.textView1);
  9.         Button button = (Button) findViewById(R.id.btnSearch);
  10.         button.setOnClickListener(new View.OnClickListener() {

  11.             @Override
  12.             public void onClick(View v) {
  13.                 // TODO Auto-generated method stub
  14.                 ReadUrl("");
  15.             }
  16.         });

  17.     }

  18.     public void ReadUrl(String url) {
  19.         new AsyncTask<String, Integer, String>() {

  20.             @Override
  21.             protected void onPreExecute() {
  22.                 // TODO Auto-generated method stub
  23.                 super.onPreExecute();
  24.             }

  25.             @Override
  26.             protected void onPostExecute(String result) {
  27.                 // TODO Auto-generated method stub
  28.                 
  29.                 tView.setText(result);   //更新UI界面
  30.                 super.onPostExecute(result);
  31.             }

  32.             @Override
  33.             protected void onProgressUpdate(Integer... values) {
  34.                 // TODO Auto-generated method stub
  35.                 System.out.println("--------->>"+values[0]);
  36.                 super.onProgressUpdate(values);
  37.                 
  38.                 
  39.             }

  40.             @Override
  41.             protected void onCancelled(String result) {
  42.                 // TODO Auto-generated method stub
  43.                 super.onCancelled(result);
  44.             }

  45.             @Override
  46.             protected void onCancelled() {
  47.                 // TODO Auto-generated method stub
  48.                 super.onCancelled();
  49.             }

  50.             @Override
  51.             protected String doInBackground(String... params) {

  52.                 URL url;
  53.                 try {
  54.                     url = new URL(params[0]);
  55.                     URLConnection urlConnection = url.openConnection();
  56.                     int total=urlConnection.getContentLength();
  57.                     InputStream inStream = urlConnection.getInputStream();
  58.                     InputStreamReader inReader = new InputStreamReader(inStream);
  59.                     BufferedReader bfReader = new BufferedReader(inReader);

  60.                     String line;
  61.                     StringBuilder sBuilder = new StringBuilder();
  62.                     while ((line = bfReader.readLine()) != null) {
  63.                         sBuilder.append(line);
  64.                         publishProgress(sBuilder.length()/total);
  65.                     }
  66.                      
  67.                     inReader.close();
  68.                     inStream.close();
  69.                     
  70.                 //    System.out.println(sBuilder);
  71.                     return sBuilder.toString();
  72.                 } catch (MalformedURLException e2) {
  73.                     // TODO Auto-generated catch block
  74.                     e2.printStackTrace();
  75.                 } catch (IOException e1) {
  76.                     // TODO Auto-generated catch block
  77.                     e1.printStackTrace();
  78.                 }
  79.                 return null;
  80.             }

  81.         }.execute(url);

  82.     }

  83. }
     

  





阅读(2279) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~