AsyncTask onPostExecute永远不会被调用
我不知道我在做什么错,但onPostExecute永远不会被调用。
- 创build了一个名为BaseActivity.java的基类
- 从我原来的活动,我扩展了这个类。
- 在BaseActivity中放置PostToOpenFeint类
-
从主要活动的UI线程中调用它我做的:
new PostToOpenFeint.execute();
onPreExecute(),doInBackground(..)被触发,但由于某种原因,onPostExecute永远不会被调用。
先谢谢你!
戴夫
private class PostToOpenFeint extends AsyncTask<Void, Void, Void> { /* * (non-Javadoc) * * @see android.os.AsyncTask#doInBackground(Params[]) */ @Override protected Void doInBackground(Void... params) { // does all the work here return null; } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPostExecute(java.lang.Object) */ @Override protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); Toast.makeText(MainScreen.this, "Done syncing", Toast.LENGTH_LONG).show(); } /* * (non-Javadoc) * * @see android.os.AsyncTask#onPreExecute() */ @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); Toast.makeText(MainScreen.this, "About to sync all your scores", Toast.LENGTH_LONG).show(); }
更多地看,这是我能够观察到的。 例如,如果我把这个电话:
new PostToOpenFeint.execute();
在onCreate活动后,一切正常。 如果我把这个调用放在一个button监听器里面。
settingsButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { new PostToOpenFeint.execute(); } });
onPostExecute()永远不会被调用,不知道我做错了什么。 我读的限制是从UI线程调用这个,我从UI线程调用它。
我刚才有一个类似的问题。 我正在扩展AsyncTask<Integer,Integer,Integer>
和我的onPostExecute方法看起来像这样:
protected void onPostExecute(int result)
这对我来说似乎是可以的,但是我再次是一个.NET人,而不是Java人。 我把它改成:
protected void onPostExecute(Integer result)
因为Java认为int
和Integer
有区别吗?
我认为你的问题是你声明返回types为void
在你的:
extends<Void,Void,Void>
这意味着没有参数,没有进展,没有结果。 如果你想在执行的时候执行一些东西,我认为你需要给它一些类似于整数或布尔值的值。
如果你改变你的延伸到:
<Void,Void,Integer>
现在你没有任何参数,没有发表任何进展,但正在返回一个价值。 改变你的onPostExecute
方法来接受一个Integer
:
protected void onPostExecute(Integer result)
然后将doInBackground
方法中的返回更改为如下所示的内容:
return 1;
那么它应该为你执行。
还有一个关于AsyncTasks的问题,我刚刚花了半天的时间:
AsyncTask类必须在UI线程上加载。 这从JELLY_BEAN自动完成。
说文档。 在姜饼(可能之前),给出正确的情况下,这导致onPostExecute
不运行。 然而,解决scheme很简单,只是一个
new MyAsyncTask();
在UI线程的早期,所以在后台的任何东西可能会无意中加载它的类加载。
我在后台线程的AsyncTask子类中使用了一个静态函数,根据时间的不同,在UI线程上的任何东西都使用了AsyncTask子类,宾果,一个很好的Heisenbug。
(忍受我回答这个老问题,已经回答了问题,但是我没有发现任何信息的珍闻,这是我的第一篇文章)
请注意,如果您通过cancel()
取消任务 ,则不会调用onPostExecute()
。 非常合乎逻辑,但只是忽略了对这种方法的呼叫让我难住了。
我的问题是,我没有@Override onPostExecute方法正确。 我通过单击鼠标右键 – >源 – >覆盖\实施方法来解决这个问题。
希望它可以帮助别人
也许doInBackground()中的代码永远不会返回?
只需将此代码添加到您的活动。 它的asynchronous任务的问题不正确地初始化,因为它应该做的。
try { Class.forName("android.os.AsyncTask"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
只需更改onPostExecute中的参数
@Override protected void onPostExecute(Void unused) { ...}
现在该方法应该被调用。
只需使用onPostExecute中的正确参数,使用public void onPostExecute(Boolean response){}而不是public void onPostExecute(boolean response){}解决了我的问题
- 如何从处理程序中删除所有callback?
- 为什么Activity的构造函数中的getApplicationContext()会引发空指针exception?
- Android使用gridlayoutmanager在recyclerview中的最后一个元素下面添加间距
- Android ImageView调整父母的身高和适应宽度
- Android碎片。 在屏幕旋转或configuration更改期间保留AsyncTask
- android ListView的scrollbarStyle
- 如何在android中包含布局内部布局
- AlarmManager在错误的时间发出警报
- 在android中的imageview顶部放置一个textview