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
- AsyncTask
- ASyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- AsyncTask
- Android面试题及其答案(一)
- 通知
- hdu 1880 魔咒词典
- 对话框
- C/C++ 枚举类型详解
- AsyncTask
- 设置
- wjh2005:GitHub 上有哪些完整的 iOS-App 源码值得参考?
- Qt自定义委托在QTableView中绘制控件、图片、文字
- 菜单
- 大众点评数据平台架构变迁
- 输入事件
- UML类图几种关系的总结
- neutron-server fail to start