[Java] Android中AsyncTask使用实例 →→→→→进入此内容的聊天室

来自 , 2020-03-12, 写在 Java, 查看 116 次.
URL http://www.code666.cn/view/1cd73be1
  1. package com.example.asynctasktest;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.InputStream;
  4. import org.apache.http.HttpEntity;
  5. import org.apache.http.HttpResponse;
  6. import org.apache.http.HttpStatus;
  7. import org.apache.http.client.HttpClient;
  8. import org.apache.http.client.methods.HttpGet;
  9. import org.apache.http.impl.client.DefaultHttpClient;
  10. import android.app.Activity;
  11. import android.os.AsyncTask;
  12. import android.os.Bundle;
  13. import android.view.View;
  14. import android.view.View.OnClickListener;
  15. import android.widget.Button;
  16. import android.widget.ProgressBar;
  17. import android.widget.TextView;
  18. import android.widget.Toast;
  19. public class MainActivity extends Activity {
  20.         private Button satrtButton;
  21.         private Button cancelButton;
  22.         private ProgressBar progressBar;
  23.         private TextView textView;
  24.         private DownLoaderAsyncTask downLoaderAsyncTask;
  25.     @Override
  26.     public void onCreate(Bundle savedInstanceState) {
  27.         super.onCreate(savedInstanceState);
  28.         setContentView(R.layout.main);
  29.         initView();
  30.     }
  31.         public void initView() {
  32.                 satrtButton=(Button) findViewById(R.id.startButton);
  33.                 cancelButton=(Button) findViewById(R.id.cancelButton);
  34.                 satrtButton.setOnClickListener(new ButtonOnClickListener());
  35.                 cancelButton.setOnClickListener(new ButtonOnClickListener());
  36.                 progressBar=(ProgressBar) findViewById(R.id.progressBar);
  37.                 textView=(TextView) findViewById(R.id.textView);
  38.         }
  39.    private class ButtonOnClickListener implements OnClickListener{
  40.                 public void onClick(View v) {
  41.                         switch (v.getId()) {
  42.                         case R.id.startButton:
  43.                                 //注意:
  44.                                 //1 每次需new一个实例,新建的任务只能执行一次,否则会出现异常
  45.                                 //2 异步任务的实例必须在UI线程中创建
  46.                                 //3 execute()方法必须在UI线程中调用。
  47.                                 downLoaderAsyncTask=new DownLoaderAsyncTask();
  48.                                 downLoaderAsyncTask.execute("http://www.baidu.com");
  49.                                 break;
  50.                         case R.id.cancelButton:
  51.                                 //取消一个正在执行的任务,onCancelled()方法将会被调用  
  52.                 downLoaderAsyncTask.cancel(true);
  53.                                 break;
  54.                         default:
  55.                                 break;
  56.                         }
  57.                 }
  58.            
  59.    }
  60.    //构造函数AsyncTask<Params, Progress, Result>参数说明:
  61.    //Params   启动任务执行的输入参数
  62.    //Progress 后台任务执行的进度
  63.    //Result   后台计算结果的类型
  64.    private class DownLoaderAsyncTask extends AsyncTask<String, Integer, String>{
  65.         //onPreExecute()方法用于在执行异步任务前,主线程做一些准备工作  
  66.         @Override
  67.         protected void onPreExecute() {
  68.                 super.onPreExecute();
  69.                 textView.setText("调用onPreExecute()方法--->准备开始执行异步任务");
  70.                 System.out.println("调用onPreExecute()方法--->准备开始执行异步任务");
  71.         }
  72.        
  73.         //doInBackground()方法用于在执行异步任务,不可以更改主线程中UI
  74.         @Override
  75.         protected String doInBackground(String... params) {
  76.            System.out.println("调用doInBackground()方法--->开始执行异步任务");
  77.                 try {
  78.                         HttpClient client = new DefaultHttpClient();
  79.                         HttpGet get = new HttpGet(params[0]);
  80.                         HttpResponse response = client.execute(get);
  81.                         if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
  82.                                 HttpEntity entity = response.getEntity();
  83.                                 InputStream is = entity.getContent();
  84.                                 long total = entity.getContentLength();
  85.                                 ByteArrayOutputStream bos = new ByteArrayOutputStream();
  86.                                 byte[] buffer = new byte[1024];
  87.                                 int count = 0;
  88.                                 int length = -1;
  89.                                 while ((length = is.read(buffer)) != -1) {
  90.                                         bos.write(buffer, 0, length);
  91.                                         count += length;
  92.                                         //publishProgress()为AsyncTask类中的方法
  93.                                         //常在doInBackground()中调用此方法
  94.                                         //用于通知主线程,后台任务的执行情况.
  95.                                         //此时会触发AsyncTask中的onProgressUpdate()方法
  96.                                         publishProgress((int) ((count / (float) total) * 100));
  97.                                         //为了演示进度,休眠1000毫秒
  98.                                         Thread.sleep(1000);
  99.                                 }
  100.                                 return new String(bos.toByteArray(), "UTF-8");
  101.                         }
  102.                 } catch (Exception e) {
  103.                         return null;
  104.                 }
  105.                 return null;
  106.         }
  107.        
  108.         //onPostExecute()方法用于异步任务执行完成后,在主线程中执行的操作
  109.         @Override
  110.         protected void onPostExecute(String result) {
  111.                 super.onPostExecute(result);   
  112.                 Toast.makeText(getApplicationContext(), "调用onPostExecute()方法--->异步任务执行完毕", 0).show();
  113.                 //textView显示网络请求结果
  114.                 textView.setText(result);
  115.                 System.out.println("调用onPostExecute()方法--->异步任务执行完毕");
  116.         }
  117.            
  118.         //onProgressUpdate()方法用于更新异步执行中,在主线程中处理异步任务的执行信息  
  119.         @Override
  120.         protected void onProgressUpdate(Integer... values) {
  121.                 super.onProgressUpdate(values);
  122.                 //更改进度条
  123.                 progressBar.setProgress(values[0]);
  124.                 //更改TextView
  125.                 textView.setText("已经加载"+values[0]+"%");
  126.         }
  127.        
  128.         //onCancelled()方法用于异步任务被取消时,在主线程中执行相关的操作
  129.         @Override
  130.         protected void onCancelled() {
  131.                 super.onCancelled();
  132.                 //更改进度条进度为0
  133.                 progressBar.setProgress(0);
  134.                 //更改TextView
  135.                 textView.setText("调用onCancelled()方法--->异步任务被取消");
  136.                 System.out.println("调用onCancelled()方法--->异步任务被取消");
  137.         }
  138.    }
  139. }
  140.  
  141.  
  142. //java/5883

回复 "Android中AsyncTask使用实例"

这儿你可以回复上面这条便签

captcha