【Android基础知识】AsyncTask基本使用

AsyncTask 任务

什么是线程的阻塞?

一个功能正在进行网络访问(耗时操作),另一个功能要实现打印功能,这样就会造成阻塞。如果阻塞超过5秒则会ANR错误。

什么是异步操作?

继承 AsyncTask<Void,Void,Void>

实现 doInBackground(Void ... Arg0){执行的操作}方法就可以启动另一个线程,这个线程和主线程不在同一个线程中,不会造成阻塞。

AsyncTask的基本使用方法

生成该类的对象,并调用execute方法之后,首先执行的是onPreExecute方法,然后执行doInBackground()方法,最后执行onPostExecute()方法

例子,去网络下载一张图片,模拟耗时操作:

/**
 * 异步任务 AsyncTask 
 * AsyncTask<Params,Progress,Result>是一个抽象类,通常
 * 用于被继承,继承AsyncTask需要指定如下三个泛型参数:
 * Params: 启动任务时输入的参数
 * Progress:启动任务执行中返回进度值的类型。
 * Result:后台执行任务完成后返回结果的类型
 * 
 * doInBackground :必须重写,异步执行后台线程将要完成的任务。
 * onPreExecute:执行后台耗时操作前被调用,通常完成一些初始化操作。
 * onPostExecute:当 doInBackground 完成后,系统会自动调用
 * onPostExecute()方法,并将doInBackground方法的返回的值传给该方法。
 * onProgressUpdate 在doInBackground方法中调用publishProgress方法
 * 更新任务的执行进度后,就会触发该方法。
 */
public class MainActivity extends Activity {
	private ImageView imageView;
	private ProgressBar progressBar;
	MyAsyncTasks tasks;
	private static final String URL="https://www.baidu.com/img/bd_logo1.png";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView)findViewById(R.id.imageView1);
        progressBar = (ProgressBar)findViewById(R.id.progressBar1);
//        MyAsyncTask task = new MyAsyncTask();
//        task.execute();
        tasks = new MyAsyncTasks();
        tasks.execute(URL);
    }
    @Override
    protected void onPause() {
    	// TODO Auto-generated method stub
    	super.onPause();
    	if(tasks != null && 
    			tasks.getStatus() == AsyncTask.Status.RUNNING){
    		//cancel 方法只是将对应的AsycnTask标记为cancel状态,并不是真正的停止
    		tasks.cancel(true);
    	}
    }
    class MyAsyncTasks extends AsyncTask<String, Void, Bitmap>{

    	@Override
    	protected void onPreExecute() {
    		// TODO Auto-generated method stub
    		super.onPreExecute();
    		progressBar.setVisibility(View.VISIBLE);
    	}
    	@Override
    	protected Bitmap doInBackground(String... params) {
    		// TODO Auto-generated method stub
    		String urlString = params[0];
    		Bitmap bitmap = null;
    		URLConnection connection;
    		InputStream is;
    		if(isCancelled()){
    			//cancel状态则直接结束
    			return null;
    		}
    		try{
    			connection = new URL(urlString).openConnection();
    			is = connection.getInputStream();
    			BufferedInputStream bis = new BufferedInputStream(is);
    			bitmap = BitmapFactory.decodeStream(bis);
    			is.close();
    			bis.close();
    			Thread.sleep(3000);
    		}catch(IOException e){
    			e.printStackTrace();
    		} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    		return bitmap;
    	}
    	@Override
    	protected void onPostExecute(Bitmap result) {
    		// TODO Auto-generated method stub
    		super.onPostExecute(result);
    		progressBar.setVisibility(View.GONE);
    		imageView.setImageBitmap(result);
    		
    	}
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值