與UI線程通訊

構建AsyncTask子類的回調方法:

doInBackground:必須重寫,異步執行後臺線程將要完成的任務;

onPreExecute:執行後臺耗時操作前被調用,通常用戶完成一些初始化操作;

onPostExecute:當doInBackground()完成後,系統會自動調用該方法,並將doInBackground方法返回的值傳遞給該方法;

onProgressUpdate:在doInBackground方法中調用publishProgress()方法,更新任務的執行進度後,就會觸發該方法。

public class MyAsyncTask extends AsyncTask<Void, Void, Void> {

	@Override
	protected Void doInBackground(Void... params) {
		Log.d("abc", "doInBackground");
		publishProgress();
		return null;
	}

	@Override
	protected void onPreExecute() {
		super.onPreExecute();
		Log.d("abc", "onPreExecute");
	}

	@Override
	protected void onPostExecute(Void result) {
		super.onPostExecute(result);
		Log.d("abc", "onPostExecute");
	}

	@Override
	protected void onProgressUpdate(Void... values) {
		super.onProgressUpdate(values);
		Log.d("abc", "onProgressUpdate");
	}

}

其中,doInBackground()方法實現邏輯:

1)從params[]數組中取出相應的值作爲url;

2)訪問網絡操作;

3)將bitmap作爲返回值,返回給後面調用的方法。

AsyncTask調用流程:

在主線程中通過AsyncTask實例調用execute()方法開啓AsyncTask一步到位操作,在execute方法中傳遞一個或多個參數作爲doInBackground()方法中的一個參數;

首先,系統會調用onPreExecute()方法,需要對其進行初始化操作;

接着,調用doInBackground()方法,開始真正異步操作方法,在其進行耗時操作,並將結果返回爲我們指定的類型;

最終,在onPostExecute()方法中獲取到返回的結果,因爲onPostExecute()方法運行在主線程,從而可以對UI進行任意操作。

public class ImageTask extends Activity {
	private ImageView imageView;
	private ProgressBar progressBar;
	private static String URL = "https://img-my.csdn.net/uploads/201504/12/1428806103_9476.png";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.image_task);
		imageView = (ImageView) findViewById(R.id.image);
		progressBar = (ProgressBar) findViewById(R.id.progressbar);
		new MyAsyncTask().execute(URL);// 設置傳遞進去的參數
	}

	class MyAsyncTask extends AsyncTask<String, Void, Bitmap> {

		@Override
		protected Bitmap doInBackground(String... params) {
			// 獲取傳遞進來的參數
			String url = params[0];// 取出對應URL
			Bitmap bitmap = null;
			URLConnection connection;// 定義網絡連接的對象
			InputStream is;// 用於獲取數據的輸入流
			try {// 將url所對應的圖像解析成了bitmap
				connection = new URL(url).openConnection();// 獲取網絡連接對象
				is = connection.getInputStream();// 獲取輸入流
				BufferedInputStream bis = new BufferedInputStream(is);
				bitmap = BitmapFactory.decodeStream(bis);// 通過decodeStream將輸入流解析成bitmap
				is.close();// 關閉輸入流
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			// 將bitmap作爲返回值
			return bitmap;
		}

		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			progressBar.setVisibility(View.VISIBLE);// 顯示進度條
		}

		@Override
		protected void onPostExecute(Bitmap bitmap) {
			super.onPostExecute(bitmap);
			// 操作UI,設置圖像
			progressBar.setVisibility(View.GONE);
			imageView.setImageBitmap(bitmap);
		}
	}

}

編寫xml文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ImageTask" >

    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>


在MainActivity中設置開始異步操作。

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		MyAsyncTask task = new MyAsyncTask();
		task.execute();
	}

	public void loadImage(View view) {
		startActivity(new Intent(this, ImageTask.class));
	}
}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="loadImage"
        android:text="Image Test" />

</LinearLayout>


最後,要去清單文件中獲取網絡權限。

    <uses-permission android:name="android.permission.INTERNET" />


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章