Android 异步处理AsyncTask

简介

Android中的AsyncTask适用于简单的异步任务处理。

AsyncTask是封装过的后台任务类,异步任务。它大大降低了开发难度

复杂的异步任务开发推荐使用Handler加Thread。

 

为什么要用异步?

耗时操作不在UI线程中执行,会导致UI堵塞,严重影响用户体验。

Android中网络操作如果在UI线程中执行会直接报错。

功能介绍

  1. AsyncTask定义了三种泛型类型 ParamsProgressResult
  2. Params启动后台任务的输入参数
  3. Progress后台执行任务的进度
  4. Result后台执行任务的返回结果
  5. doInBackground抽象方法必须实现,耗时的操作都放这里。不可对UI操作
  6. onPreExecute执行doInBackground的预处理
  7. onProgressUpdate可以再执行doInBackground过程UI进行更新,doInBackground通过publishProgress方法向它发送消息
  8. onPostExecute执行完doInBackground调用,doInBackground的执行结果会作为参数传入
  9. onCancelled取消时进行的操作

注意事项

  1. AsyncTask只能在UI线程中创建
  2. Execute方法只能在UI线程调用
  3. Execute方法不能重复被调用

实例1-下载:

package com.example.asynctaskdemo;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;

public class DownloadTest extends Activity {
	
	private static final String URL = "https://imgblog.csdnimg.cn/20190321140536348.png";
	
	ImageView mImageView;
	ProgressBar mProgressBar;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.download_activity);
		
		mImageView = (ImageView) findViewById(R.id.image);
		mProgressBar = (ProgressBar) findViewById(R.id.progressbar);
		
		new DownLoadTask().execute(URL);
	}
	
	class DownLoadTask extends AsyncTask<String, Void, Bitmap> {

		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			mProgressBar.setVisibility(View.VISIBLE);
		}
		
		@Override
		protected Bitmap doInBackground(String... params) {
			
			Bitmap mBitmap = null;
			String url = params[0];
			URLConnection connection;
			InputStream is;
			
			try {
				connection = new URL(url).openConnection();
				is = connection.getInputStream();
				BufferedInputStream bis = new BufferedInputStream(is);
				mBitmap = BitmapFactory.decodeStream(bis);
				is.close();
				bis.close();
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			
			return mBitmap;
		}
		
		@Override
		protected void onPostExecute(Bitmap result) {
			super.onPostExecute(result);
			
			mImageView.setImageBitmap(result);
			mImageView.setVisibility(View.VISIBLE);
			mProgressBar.setVisibility(View.GONE);
		}
		
	}
}

实例2-更新Progress:

package com.example.asynctaskdemo;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ProgressBar;

public class ProgressTest extends Activity {
	
	private ProgressBar mProgressBar;
	private ProgressTask mProgressTask;
	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.progress_activity);
		mProgressBar = (ProgressBar) findViewById(R.id.progressbar);
		mProgressTask = new ProgressTask();
		mProgressTask.execute();
	}
	
	class ProgressTask extends AsyncTask<Void, Integer, Void> {

		@Override
		protected Void doInBackground(Void... params) {
			for (int i = 1; i <= 100; i++) {
				if(isCancelled()) {
					return null;
				}
				try {
					Thread.sleep(250);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				publishProgress(i);
			}
			return null;
		}
		
		@Override
		protected void onProgressUpdate(Integer... values) {
			super.onProgressUpdate(values);
			
			mProgressBar.setProgress(values[0]);
		}
	}
	
	@Override
	protected void onPause() {
		super.onPause();
		if (mProgressTask !=null && mProgressTask.getStatus() == AsyncTask.Status.RUNNING) {
			mProgressTask.cancel(false);
		}
	}
}

实例3-直接运行runnable:

package com.example.asynctaskdemo;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class RunnableTest extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        AsyncTask.execute(new Runnable(){
            @Override
            public void run() {
                for (int i = 1; i <= 20; i++) {
                    try {
                        Log.i(TAG, "RunnableTest:"+i);
                        Thread.sleep(250);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
}
 

猜你喜欢

转载自blog.csdn.net/weixin_39821531/article/details/88738780