0

我在 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”返回更新后的数字?

编辑:我听说过对象监听器(听一些动作)。我需要学习如何为这个场合制作它们还是有其他解决方案?

4

3 回答 3

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,所以如果有必要的话,如果有人能纠正括号,那就太好了!

格雷茨

于 2013-11-12T13:06:57.253 回答
0

也许您可能对以下链接感兴趣?当我遇到类似的问题时,有时我会使用锁来让一个线程通知另一个线程发生了一些重要的事情。

http://docs.oracle.com/javase/tutorial/essential/concurrency/newlocks.html

于 2013-11-12T12:48:21.837 回答
0

我真的没有得到你想要做什么,但我认为你可以使用等待和通知。您可以使用运行日志记录的线程等待对象,并在执行图片获取或 w\e 的线程中通知

于 2013-11-12T13:03:43.217 回答