正如我所说,这是否正确使用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());
}
}
}
谢谢。
答案 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,所以它会给您带来异常。替代方法是使用Handler
或runOnUIThread()
从非UI线程更新UI。