可以像这样使用AsyncTask:

时间:2012-10-05 11:42:38

标签: android android-asynctask

正如我所说,这是否正确使用AsyncTask?

我的意思是,在不使用任何参数的情况下,在onPreExecute()上传递活动上下文,而不是获得doInBackground()返回值的结果,但是onPostExecute()之后的经理本身是调用。

还有一件事,关于onPostExecute()的Asynctask API Reference:“如果任务被取消,则不会调用此方法。”那么如果在执行doInBackground()方法时发生SomeException,¿onPostExecuted()是否被调用?

public class MainClass {
    ...
    //Somewhere in the class, the task is called:
    new MyAsyncTask.execute();
    ...

    private class MyAsyncTask extends AsyncTask <Void,Void,Void> {

        private MyManager manager;

        protected void onPreExecute(){
            super.onPreExecute();
            //We initialice the members here, passing the context like this:
            manager = new Manager(MainClass.this);
            manager.initializeMembers();
        }

        protected void doInBackgroud(Void ...params){
            try{
                //here we use the long operation task that is inside the manager:
                manager.startLongTask();                
            } catch (SomeException e){
                doWhatEverItIsWith(e);
            }
            return null;
        }

        protected void onPostExecute (Void result){
            super.onPostExecute(result);
            //Here we get the result from the manager
            handleTheResultFromHere(manager.getResult());
        }
    }
}

谢谢。

2 个答案:

答案 0 :(得分:1)

使用像这样的AsyncTask没有问题。您不必使用doInBackground返回值。关于第二个问题,即使例外,也会调用onPostExecute。如果您不想打电话,则必须使用MyAsyncTask.cancel(true)

答案 1 :(得分:1)

  

正如我所说,这是否正确使用AsyncTask?

是的,可以在onPreExecute()中传递活动上下文,然后在doInBackgroud()中加载数据并更新onPostExecute()中的用户界面。

  

那么如果SomeException在执行时发生了怎么办?   doInBackground()方法,是onPostExecuted()调用吗?

是的,如果您在onPreExecute()中收到任何例外,系统会调用doInBackgroud()。您必须检查要加载的数据onPreExecute()检查数据是否为空并更新UI。

NOTE:

永远不要尝试从doInBackgroud()更新UI,因为您无法从非UI线程更新UI,所以它会给您带来异常。替代方法是使用HandlerrunOnUIThread()从非UI线程更新UI。