AsyncTask

来源:互联网 发布:幼儿园监控软件 编辑:程序博客网 时间:2024/05/29 03:29
package com.example.asynctasktest;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.ClientProtocolException;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.os.AsyncTask;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ProgressBar;import android.widget.TextView;/** * 一个异步任务的执行一般包括以下几个步骤:1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。*/public class MainActivity extends Activity {    private static final String TAG="ASYNC_TASK";    private Button mBtExecute,mBtCancel;    private ProgressBar progressbar;    private TextView textView;    private MyAsyncTask myAsyncTask;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        // TODO Auto-generated method stub        mBtExecute = (Button) findViewById(R.id.execute);        mBtCancel = (Button) findViewById(R.id.cancel);        progressbar = (ProgressBar) findViewById(R.id.progress_bar);        textView = (TextView) findViewById(R.id.text_view);        mBtExecute.setOnClickListener(new MyListen());    }    class MyListen implements OnClickListener{        @Override        public void onClick(View v) {            // TODO Auto-generated method stub            switch (v.getId()) {            case R.id.execute:                myAsyncTask=new MyAsyncTask();                myAsyncTask.execute("http://www.baidu.com");                mBtExecute.setEnabled(false);                mBtCancel.setEnabled(true);                break;            case R.id.cancel:                 //取消一个正在执行的任务,onCancelled方法将会被调用                myAsyncTask.cancel(true);                break;            default:                break;            }        }    }     class MyAsyncTask extends AsyncTask<String, Integer, String>{        //execute 后执行,执行后台任务前 做一些ui标记        @Override        protected void onPreExecute() {            // TODO Auto-generated method stub            textView.setText("loading...");        }        //onPreExecute 后执行,做一些后台耗时操作,接收输入的参数params,在执行的过程中可用调用publishProgress(Progress... values)来更新进度信息。params[0]表示传进来三个参数中的第一个        @Override        protected String doInBackground(String... params) {            // TODO Auto-generated method stub              try {                      HttpClient client = new DefaultHttpClient();                      HttpGet get = new HttpGet(params[0]);                      HttpResponse response = client.execute(get);                      if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {                          HttpEntity entity = response.getEntity();                          InputStream is = entity.getContent();                          long total = entity.getContentLength();                          ByteArrayOutputStream baos = new ByteArrayOutputStream();                          byte[] buf = new byte[1024];                          int count = 0;                          int length = -1;                          while ((length = is.read(buf)) != -1) {                              baos.write(buf, 0, length);                              count += length;                              //调用publishProgress公布进度,最后onProgressUpdate方法将被执行                              publishProgress((int) ((count / (float) total) * 100));                              //为了演示进度,休眠500毫秒                              Thread.sleep(500);  //                  Thread.sleep(500);                }                return new String(baos.toByteArray(),"gb2312");            }            } catch (Exception e) {                // TODO Auto-generated catch block                e.printStackTrace();            }             return null;        }        //当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。        @Override        protected void onPostExecute(String result) {            // TODO Auto-generated method stub            textView.setText(result);            mBtExecute.setEnabled(true);            mBtCancel.setEnabled(false);        }        //在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。        @Override        protected void onProgressUpdate(Integer... values) {            // TODO Auto-generated method stub            progressbar.setProgress(values[0]);            textView.setText("loading..."+values[0]+"%");            mBtExecute.setEnabled(true);            mBtCancel.setEnabled(false);        }        @Override        protected void onCancelled() {            // TODO Auto-generated method stub            textView.setText("cancelled");            progressbar.setProgress(0);            mBtExecute.setEnabled(true);            mBtCancel.setEnabled(false);        }    }}
0 0
原创粉丝点击