package com.zjw.myservice2; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; //10.2.4 p347 使用AsyncTask /* 基本用法: AsyncTask是抽象类,创建一个类继承它,可指定三个泛型参数: Params:执行AsyncTask时需要传入的参数,可用于后台任务中 Progress:后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位 Result:当执行任务完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型 最简单写法: class DownloadTask extends AsyncTask<void,Integer,Boolean>{...} 此时为空任务,要重写方法,常用: 1.onPreExecute() 在后台任务开始执行之前调用,用于进行一些界面上的初始化操作,比如显示一个进度条对话框 2.onInBackground(Params...) 其中所有代码都会在子线程中运行,在这里处理所有耗时任务 任务完成通过return语句将结果返回,如果泛型第3个参数为void则不用返回 其中不能进行UI操作,如需更新UI,如反馈当前任务进度,可调用publishProgress(Progress...) 3.onProgressUpdate(Progress...) 在后台调用publishProgress(Progress...)方法后,此方法就很快会被调用,参数就是在后台任务中传递来的 在此可对UI进行操作 4.onPostExecute(Result) 后台任务执行完毕并通过return语句进行返回时,这个方法很快会被调用 返回的数据作为参数传递到此方法, 可用返回数据进行一些UI操作,如提醒任务执行结果,关闭进度条对话框等 */ /* 启动这个任务: new DownloadTask().execute(); */ public class UseOfAsyncTask extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_use_of_async_task); new DownloadTask(UseOfAsyncTask.this).execute(); } }
package com.zjw.myservice2; import android.app.ProgressDialog; import android.content.Context; import android.os.AsyncTask; import android.widget.Toast; /** * Created by hp on 2017/7/27. */ public class DownloadTask extends AsyncTask<Void, Integer, Boolean> { Context mContext; private ProgressDialog mProgressDialog; int i = 0; public DownloadTask(Context context) { mContext = context; } //在后台任务开始执行之前调用,用于进行一些界面上的初始化操作 @Override protected void onPreExecute() { mProgressDialog = new ProgressDialog(mContext); mProgressDialog.setTitle("This is ProgressDialog"); mProgressDialog.show();//显示进度条对话框 } //其中所有代码都会在子线程中运行,在这里处理所有耗时任务 @Override protected Boolean doInBackground(Void... params) { try { while (true) { int downloadPercent = doDownload();//用于计算当前的下载进度并返回 publishProgress(downloadPercent); if (downloadPercent >= 100) { break; } } } catch (Exception e) { e.printStackTrace(); return false; } return true; } @Override protected void onProgressUpdate(Integer... values) { //在这里更新下载进度 mProgressDialog.setMessage("Downloaded " + values[0] + "%"); } @Override protected void onPostExecute(Boolean result) {//在主线程 mProgressDialog.dismiss();//关闭进度对话框 //在这里提示下载结果 if (result) { Toast.makeText(mContext, "Download succeeded", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(mContext, "Download failed", Toast.LENGTH_SHORT).show(); } } private int doDownload() { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } i += 10; return i; } }