黑马程序员技术交流社区

标题: 异步加载AsyncTask有哪些方法以及注意事项 [打印本页]

作者: 黑马生力军    时间: 2015-8-27 15:41
标题: 异步加载AsyncTask有哪些方法以及注意事项
如题求告知

作者: ithemazl    时间: 2015-8-27 15:42
1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。


2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。
主线程 做准备工作,一般用来初始化控件

3.doInBackground(Params... params),
在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。
子线程 耗时操作的

4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。
执行在主线程,用于跟新进度的

5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。
接收数据,接收子线程传过来的数据 主线程

注意事项
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调  用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
作者: woshiku    时间: 2015-8-27 17:52
在使用的时候,有几点需要格外注意:
1.异步任务的实例必须在UI线程中创建。
2.execute(Params... params)方法必须在UI线程中调用。
3.不要手动调用onPreExecute(),doInBackground(Params... params),onProgressUpdate(Progress... values),onPostExecute(Result result)这几个方法。
4.不能在doInBackground(Params... params)中更改UI组件的信息。
5.一个任务实例只能执行一次,如果执行第二次将会抛出异常。
示例:
MyTask myTask = new MyTask();
//开始一个任务(注意:一个对象只能调用一次)
myTask.execute("woshiku");
//取消一个正在执行的任务,onCancelled方法将会被调用  
  mTask.cancel(true);
/* <String, Integer, String>第一个参数String接受用户输入的参数如"woshiku" 用于doInBackground(String... params)第二个参数Integer用于onProgressUpdate(Integer... progresses)第三个参数String用于返回结果onPostExecute(String result)可以打印一下LOG然后对比一下

*/
class MyTask  extends AsyncTask<String, Integer, String>{
        //onPreExecute方法用于在执行后台任务前做一些UI操作  
        @Override  
        protected void onPreExecute() {  
            Log.i(TAG, "onPreExecute() called");  
        }  
        //doInBackground方法内部执行后台任务,不可在此方法内修改UI  
        @Override  
        protected String doInBackground(String... params) {  
            //打印出woshiku
            Log.i(TAG, "doInBackground(Params... params) called"+params[0]);
            for(int i=0;i<10;i++){
                //调用onProgressUpdate(Integer... progresses)
                publishProgress(i);
            }  
            return null;  
        }  
        //onProgressUpdate方法用于更新进度信息  
        @Override  
        protected void onProgressUpdate(Integer... progresses) {  
            Log.i(TAG, "onProgressUpdate(Progress... progresses) called"+progresses[0]);  
        }  
         
        //onPostExecute方法用于在执行完后台任务后更新UI,显示结果  
        @Override  
        protected void onPostExecute(String result) {  
            Log.i(TAG, "onPostExecute(Result result) called"+result);  
        }  
         
        //onCancelled方法用于在取消执行中的任务时更改UI  
        @Override  
        protected void onCancelled() {  
            Log.i(TAG, "onCancelled() called");  
        }  
}
作者: liuch111    时间: 2015-8-27 20:13
黑马币 还能负的  
厉害..
作者: ithemazl    时间: 2015-8-27 20:59
liuch111 发表于 2015-8-27 20:13
黑马币 还能负的  
厉害..

你不说我都没发现




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2