Android入门笔记之AsyncTask

来源:互联网 发布:苹果mac改变用户 编辑:程序博客网 时间:2024/04/29 13:28

Android入门笔记之AsyncTask

<1>简介

多线程是android重要的机制之一。

<2>关键步骤

       Android中通过AsyncTask和标准的Thread类来提供线程服务,将某些操作从主UI现呈上分离开来。

 

       AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p) ,在此方法中实现任务的执行工作,比如连接网络获取数据等。通常还应该实现onPostExecute(Result r)方法,因为应用程序关心的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创建实例。AsyncTask定义了三种泛型类型 Params,Progress和Result。

    * Params 启动任务执行的输入参数,比如HTTP请求的URL。
    * Progress 后台任务执行的百分比。
    * Result 后台执行任务最终返回的结果,比如String。

      AsyncTask 的执行分为四个步骤。每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用。

    * onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。
    * doInBackground(Params...) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress...)来更新任务的进度。
    * onProgressUpdate(Progress...) 此方法在主线程执行,用于显示任务执行的进度。
    * onPostExecute(Result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回。

<3>出现的问题

       无

<4>代码及解释

       AsyncActivity:

package com.activity;import java.io.ByteArrayOutputStream;import java.io.InputStream;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import android.app.Activity;import android.app.ProgressDialog;import android.content.Context;import android.content.DialogInterface;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import com.test.R;public class AsyncActivity extends Activity{/**    * @ProjectName:  [androidtest]  * @Package:      [com.activity.AsyncActivity.java]   * @ClassName:    [AsyncActivity]    * @Description:     * @Author:       [gmj]    * @CreateDate:   [2013-9-6 下午7:33:52]    * @Version:      [v1.0]  */private TextView message;    private Button open;    private EditText url;    @Override    public void onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);       setContentView(R.layout.activity_async);       message= (TextView) findViewById(R.id.async_view);       url= (EditText) findViewById(R.id.async_text);       open= (Button) findViewById(R.id.async_but);       open.setOnClickListener(new View.OnClickListener() {           public void onClick(View arg0) {              connect();           }       });    }        private void connect() {        PageTask task = new PageTask(this);        task.execute(url.getText().toString());    }        class PageTask extends AsyncTask<String, Integer, String> {        // 可变长的输入参数,与AsyncTask.exucute()对应        ProgressDialog pdialog;        public PageTask(Context context){            pdialog = new ProgressDialog(context, 0);               pdialog.setButton("cancel", new DialogInterface.OnClickListener() {            public void onClick(DialogInterface dialog, int i) {            dialog.cancel();            }            });            pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() {             public void onCancel(DialogInterface dialog) {              finish();             }            });            pdialog.setCancelable(true);            pdialog.setMax(100);            pdialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);            pdialog.show();        }        @Override        protected String doInBackground(String... params) {            try{               HttpClient client = new DefaultHttpClient();               // params[0]代表连接的url               HttpGet get = new HttpGet(params[0]);               HttpResponse response = client.execute(get);               HttpEntity entity = response.getEntity();               long length = entity.getContentLength();               InputStream is = entity.getContent();               String s = null;               if(is != null) {                   ByteArrayOutputStream baos = new ByteArrayOutputStream();                   byte[] buf = new byte[128];                   int ch = -1;                   int count = 0;                   while((ch = is.read(buf)) != -1) {                      baos.write(buf, 0, ch);                      count += ch;                      if(length > 0) {                          // 如果知道响应的长度,调用publishProgress()更新进度                          publishProgress((int) ((count / (float) length) * 100));                      }                      // 让线程休眠100ms                      Thread.sleep(100000);                   }                   s = new String(baos.toByteArray());              }               // 返回结果               return s;            } catch(Exception e) {               e.printStackTrace();            }            return null;        }        @Override        protected void onCancelled() {            super.onCancelled();        }        @Override        protected void onPostExecute(String result) {            // 返回HTML页面的内容            message.setText(result);            pdialog.dismiss();         }        @Override        protected void onPreExecute() {            // 任务启动,可以在这里显示一个对话框,这里简单处理            message.setText("线程启动");        }        @Override        protected void onProgressUpdate(Integer... values) {            // 更新进度              System.out.println(""+values[0]);              message.setText(""+values[0]);              pdialog.setProgress(values[0]);        }     }}


原创粉丝点击