我在我的应用程序中使用asynctask从Internet下载一些数据。如果此任务在几秒钟内执行两次,用户按下按钮两次,我收到IllegalState错误,说明任务无法执行两次。如果用户等待大约30秒,那么一切都很好。
然后我尝试使用AsyncTask.getStatus(),like this,仅在任务未运行时执行,即在状态为PENDING或FINISHED时执行,但这仅在getStatus第一次执行时( )正在等待。如果它已完成,则会产生相同的IllegalState错误。
然后我尝试跟随另一个example,说每次应该执行时都应该创建AsyncTask的新对象。这似乎有效。
所以我的问题是,是不是可以使用asynctask对象的一个实例并重新执行它?如果是这样,如果等待很长时间(如30秒),怎么办呢?
答案 0 :(得分:1)
没有。您不能两次执行相同的异步任务。您可以在30秒后再次执行此操作,因为异步任务完成处理并从doInBackground()返回结果。因此,您需要每次创建一个对象或使用进度对话框阻止用户再次单击该按钮。在onPreExecute()中显示进度对话框并在onPostExecute()中关闭。
答案 1 :(得分:1)
您可以使用asynctask对象的一个实例并重新执行它,我使用它并为我工作:
if(yourAsyncTaskInstance!=null &&
yourAsyncTaskInstance.getStatus() == AsyncTask.Status.FINISHED){
yourAsyncTaskInstance = new YourAsyncTaskClass();
yourAsyncTaskInstance.execute();
}
答案 2 :(得分:0)
没有看到你的代码,很难知道为什么它可能在30秒等待后工作,但是,你是对的:正如docs所说,"The task can be executed only once (an exception will be thrown if a second execution is attempted.)"