本文共 3282 字,大约阅读时间需要 10 分钟。
Android 提供了一个好用的工具---AsyncTask ,方便我们在子线程中对 UI 进行操作,AsyncTask 背后的实现原理也是基于异步消息处理机制的。下面是AsyncTask的一个小demo。
package com.demo.asynctaskdemo;import android.app.Activity;import android.app.ActionBar;import android.app.Fragment;import android.os.AsyncTask;import android.os.Bundle;import android.util.Log;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.ProgressBar;import android.widget.TextView;import android.widget.Toast;import android.os.Build;public class MainActivity extends Activity { private ProgressBar progress; private TextView baifenbi ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progress = (ProgressBar) findViewById(R.id.progressBar); baifenbi = (TextView) findViewById(R.id.baifenbi) ; new MyTask().execute() ; } class MyTask extends AsyncTask4、MyApplication.java中的代码:{ private static final String TAG = "MyTask"; /** * onPreExecute方法,在后台任务开始执行之前调用,用于进行一些界面上的初始化操作,比 如显示一个进度条对话框等。 */ @Override protected void onPreExecute() { // TODO Auto-generated method stub Toast.makeText(MyApplication.getContext(), "onPreExecute方法,界面上的初始化操作", 1).show(); } /** * doInBackground方法,在子线程中运行,去处理所有的耗时任 务. 任务完成可以通过 return 语句来将任务的执行结果返回, * 如果 AsyncTask 的 第三个泛型参数指定的是 Void,就可以不返回任务执行结果。 @ 注意,在这个方法中是不 可以进行 UI * 操作的,如果需要更新 UI元素, 比如说反馈当前任务的执行进度,可以调 用 * publishProgress(Progress...)方法来完成。 */ @Override protected Boolean doInBackground(Void... params) { // TODO Auto-generated method stub Log.d(TAG, "--doInBackground" + params); int progress = 1; while (true) { try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } publishProgress(progress); if (progress >= 100) { progress = 0 ; break; } progress++ ; } return true; } /** * 在后台任务中调用了 publishProgress(Progress...)方法后,这个方法就会被调用, * 方法中携带的参数就是在后台任务中传递过来的。 在这个方法中可以对 UI 进行操作,利用参数中的数值就可以对界面元素进行相应地更新。 */ @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub String text = "" ; if(values[0] == 100) { text = "下载完成" ; }else { text = values[0]+" %" ; } progress.setProgress(values[0]); baifenbi.setText(text); } /** * 后台任务执行完毕并通过 return 语句进行返回时,这个方法就会被调用。 * 返回的数据会作为参数传递到此方法中,可以利用返回的数据来进行一些 UI 操作, 比如说提醒任务执行的结果,以及关闭掉进度条对话框等。 */ @Override protected void onPostExecute(Boolean result) { // TODO Auto-generated method stub Toast.makeText(MyApplication.getContext(), "进入onPostExecute方法", 1).show(); } }}
package com.demo.asynctaskdemo;import android.app.Application;import android.content.Context;public class MyApplication extends Application { private static Context context; @Override public void onCreate() { context = getApplicationContext(); } public static Context getContext() { return context; }}5、AndroidManifest.xml中的代码:
项目下载: