我在Java / Android中有一些代码。请看一下以下代码:
@Override
public void onReceive(Context context, Intent intent) {
mInfo.execute();
recentPics= mInfo.getNumberOfRecentPics();
Log.d("LOG", ""+recentPics);
}
mInfo变量是AsyncTask的一个对象,它从Web服务器中提取最近的图片数量。它们是成功的,但问题是“LOG”显示了当前执行的代码中最近的旧图片。例如:
//Receiver execution No1
recentPics = 0;
m.Info.getNumberOfRecentPics() // let's say returns 3
Log.d("LOG", ""+recentPics) // will show 0 at this point of time
//Receiver execution No2
m.Info.getNumberOfRecentPics() // let's say returns 5
Log.d("LOG", ""+recentPics) // will show 3 at this point of time (reads variable from previous execution )
我知道这是因为“LOG”代码在“getNumberOfRecentPics”方法完成它的工作之前执行。
问题:我的问题很简单。如何等待代码执行,直到“getNumberOfRecentPics”返回更新的数字?
编辑:我听说过对象监听器(听一些动作)。我是否需要学习如何在这种场合制作它们,还是有另一种解决方案?
答案 0 :(得分:2)
我会这样使用它,只需覆盖你需要它的onPostExecute或创建一个自己的界面
//create a object f your asyncclass and
//override the onPostExecute where you need it
mInfo = new ASYNCCLASS({
@Override
public void onPostExecute(Object result){
//doSomething
Log.e(...);
}
}).execute();
等待不是答案,因为你不知道你的Asynctask需要多长时间才能结束。 上面的代码没有测试,只是假,但它应该显示我的意思。
这里没有我的IDE,所以如果有必要的话,任何人都会更正括号!
格尔茨
答案 1 :(得分:0)
您可能对以下链接感兴趣吗?当我遇到类似的问题时,我有时会使用锁来让一个线程通知另一个线程,发生了重要的事情。
http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html
答案 2 :(得分:0)
我没有真正得到你想要做的事情,但我认为你可以使用等待和通知。您可以使用运行Logging的线程等待一个Object,并在执行pics获取的线程中通知或w \ e