1. 基本用法:
public class MainActivity extends Activity { @Override PRotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 执行异步任务 new MyAsyncTask().execute(); } /** * 使用AsyncTask, 需要创建一个 AsyncTask 的子类, 注意泛型, 这里可以先传Void * */ private class MyAsyncTask extends AsyncTask<Void, Void, Void> { // 执行异步任务之前调用 @Override protected void onPreExecute() { super.onPreExecute(); // 此方法在主线程中运行 } // 在子线程中运行, 可以做耗时操作 @Override protected Void doInBackground(Void... params) { // 此方法在子线程中运行 return null; } // 异步任务执行完后调用 @Override protected void onPostExecute(Void result) { super.onPostExecute(result); // 此方法在主线程中运行 } }}2. 三个泛型的含义2.1. 首先我们把第一个泛型改成 String,private class MyAsyncTask extends AsyncTask<String, Void, Void>{...}此时 doInBackground 会报错, 第一个泛型其实是 doInBackground 方法的参数类型
@Overrideprotected Void doInBackground(String... params) { // 此方法在子线程中运行 // 获取方法参数 System.out.println(params[0]); return null;}那么这个参数的值是从哪里传过来呢? 是在执行异步任务的时候传入的:new MyAsyncTask().execute("http://www.baidu.com");2.2. 把第二个泛型改为 Integer, private class MyAsyncTask extends AsyncTask<String, Integer, Void> {...}发现没有哪里报错, 这第二个泛型的用法如下:
protected Void doInBackground(String... params) { // 此方法在子线程中运行 System.out.println(params[0]); for (int i = 0; i < 10; i++) { SystemClock.sleep(500); // 更新进度, 第二个泛型其实是这个方法的参数类型 publishProgress(i); } return null;}// 当在 doInBackground 中调用 publishProgress 后, 这个方法会被调用// 这个方法也是在主线程中调用的, 用于更新进度, 参数类型是第二个泛型类型@Overrideprotected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); System.out.println(values[0]);}2.3. 把第三个泛型也改为 String, private class MyAsyncTask extends AsyncTask<String, Integer, String> {...}发现 doInBackground 和 onPostExecute 都报错了第三个泛型是 doInBackground 的返回值类型, 也是 onPostExecute 的参数类型用法如下:@Overrideprotected ArrayList<String> doInBackground(String... params) { // 此方法在子线程中运行 System.out.println(params[0]); for (int i = 0; i < 10; i++) { SystemClock.sleep(500); // 此方法用于更新进度, 第二个泛型其实是这个方法的参数类型 publishProgress(i); } // 假设这个方法里从网络获取数据成功 return "成功";}// 方法参数就是 doInBackground 的返回值@Overrideprotected void onPostExecute(String result) { super.onPostExecute(result); // 此方法在主线程中运行 System.out.println(result);}
新闻热点
疑难解答