谈谈AsyncTask类

前端之家收集整理的这篇文章主要介绍了谈谈AsyncTask类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

AsyncTask是AndroidSDK自带一个异步加载数据类,今天为大家介绍一个实用模板工具类;

AsyncTask<Params,Progress,Result>,第一个参数是传入参数,比如url,自定义类,sqlite数据;第二个参数是处理过程有数据更新时用到的参数,比如,自定义异常,进度条更新数据;第三个参数是返回结果;

怎么使用AsyncTask为程序取得最快效率,一般我们都是写一个类继承该类,但这样使用却没有尽其功能,也使程序没有得到完善处理,在Android中,经常会使用ProgressDialog来处理加载大量数据,此时使用AsyncTask来封闭此类,必然会使程序简洁很多,ex:

public abstract class LoadingDialog<Input,Result> extends AsyncTask<Input,WSError,Result>{

	private ProgressDialog mProgressDialog;
	protected Activity mActivity;
	private int mLoadingMsg;
	private int mFailMsg;

	public LoadingDialog(Activity activity,int loadingMsg,int failMsg){
		this.mActivity = activity;
		this.mLoadingMsg = loadingMsg;
		this.mFailMsg = failMsg;
	}

	@Override
	public void onCancelled() {		
		//logic
		
		failMsg();
		super.onCancelled();
	}

	@Override
	public void onPreExecute() {
		String title = "";
		String message = mActivity.getString(mLoadingMsg);
		mProgressDialog = ProgressDialog.show(mActivity,title,message,true,new OnCancelListener(){

			@Override
			public void onCancel(DialogInterface dialogInterface) {
				LoadingDialog.this.cancel(true);
			}

		});
		super.onPreExecute();
	}

	@Override
	public abstract Result doInBackground(Input... params);

	@Override
	public void onPostExecute(Result result) {
		super.onPostExecute(result);

		mProgressDialog.dismiss();

		if(result != null){
			doStuffWithResult(result);
		} else {
			//logic
			failMsg();

		}
	}
	
	protected void failMsg(){
		Toast.makeText(mActivity,mFailMsg,2000).show();
	}
	
	public abstract void doStuffWithResult(Result result);
	
	@Override
	protected void onProgressUpdate(WSError... values) {
		Toast.makeText(mActivity,values[0].getMessage(),Toast.LENGTH_LONG).show();
		this.cancel(true);
		mProgressDialog.dismiss();
		super.onProgressUpdate(values);
	}
	
	public void doCancel()
	{
		mProgressDialog.dismiss();
	}

}
当我们需要定义一个加载Dialog时,继承该类,传入参数Input,结果参数Result,将后台运行代码放入doInBackground()中,结果处理在doStuffWithResult()中,此时,无论加载任何数据都可以。当需要在外部处理异常时,使用AsyncTask.publisProgress(WSError... values)即可。当有数据同时加载多时,为避免程序挂掉,在AsyncTask启动后,会有三种状态,分别是PENDING(离线,没有执行),RUNNING(运行中),FINISH(加载完成),我们即可使用这三种状态分别进行对应处理。

使用时需要注意:

1) Task的实例必须在UI thread中创建
2) execute方法必须在UI thread中调用
3) 不要手动的调用onPreExecute(),onPostExecute(Result),doInBackground(Params...),onProgressUpdate(Progress...)这几个方法

4) 该task只能被执行一次,否则多次调用时将会出现异常

猜你在找的Sqlite相关文章