与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" />


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