Android非同步任務

我叫阿狸貓發表於2014-03-11

Android提供的非同步任務方法(如果只是呼叫一次,那就不推薦用這個方法,因為這個非同步任務內部有執行緒池,最少開啟5個,保持活動的有10個,最大支援128個)

/**
 * 第一個引數:執行非同步任務傳遞的引數  在execute()方法裡傳入引數
 * 第二個引數:執行非同步任務的進度
 * 第三個引數:非同步任務的返回值
 */
new AsyncTask<Context, Integer, List<ContactInfo>>(){
	@Override
	protected List<ContactInfo> doInBackground(Context... params) {
		try {
			publishProgress(1);//這個引數傳遞給了onProgressUpdate方法
			Thread.sleep(1000);
			publishProgress(30);
			Thread.sleep(1000);
			publishProgress(70);
			Thread.sleep(1000);
			publishProgress(100);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		infos = ContactInfoProvider.getContactInfos(params[0]);
		return infos;//這個方法的返回值傳到了onPostExecute方法引數中
	}
	@Override
	protected void onProgressUpdate(Integer... values) {
		int number = values[0];
		Toast.makeText(getApplicationContext(), "當前進度:"+number, Toast.LENGTH_SHORT).show();;
		super.onProgressUpdate(values);
	}
	@Override
	protected void onPreExecute() {
		ll_select_contact.setVisibility(View.VISIBLE);
		super.onPreExecute();
	}
	@Override
	protected void onPostExecute(List<ContactInfo> result) {
		System.out.println(result.size());
		ll_select_contact.setVisibility(View.INVISIBLE);
		lv_select_contact.setAdapter(new ContactAdapter());
		super.onPostExecute(result);
	}
}.execute(this);//傳遞引數給非同步任務


自定義非同步方法

import android.os.Handler;
import android.os.Message;

public abstract class MyAsynTask {
	public abstract void onPreExecute();//執行耗時任務之前要執行的操作(例如View的顯示)

	public abstract void doInBackground();//需要開啟新執行緒的操作,在這個方法裡執行

	public abstract void onPostExecute();//執行完耗時操作後要執行的方法(例如View的隱藏)

	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			onPostExecute();
		}

	};

	public void execute() {
		onPreExecute();
		new Thread() {
			public void run() {
				doInBackground();
				handler.sendEmptyMessage(0);
			};
		}.start();
	}
}



相關文章