2013-01-24 47 views
0

我有一个Listview和一个适配器连接到它的活动。我有一个同步数据并保存的类。 (我认为我们不应该关心数据来自何处)并且它运行在不同的线程上。现在我想知道更新适配器的干净方式,但我们不应该在该类运行不同的线程时调用该类的任何活动函数。更新在不同线程上运行的其他类的Android活动的UI

我知道的一种方法是在活动中创建处理程序并将其传递给其他类并从此处使用它。但是我想知道活动是否在后台,那么活动的功能可以由UI线程调用,或者只在活动进入前台时调用。

我不想错过任何更新,并希望在前台更新活动。

+0

你有没有尝试过在Android中使用'Loaders' api? – Supreethks

+0

我宁愿使用Handler的方法。这很容易实现,你可以通过任何你想要的消息。obj – mihail

回答

0

该代码会做你想要什么:

  runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        //your actions 
       } 
     }); 
+0

如果我想在run方法中调用一些activity的函数,我需要引用activity对象,这与在UI线程上具有句柄并请求可运行的对象类似。但是我不想在后台调用活动函数,我希望函数只在前台运行时执行,因为可能会有N个不同的活动,我不想全部更新,我只想更新前台活动和其他应该在他们来到前台时打电话。 – user1875798

0

,因为它可以运行在不同的线程,我们不应该从这个类调用活动的任何功能。

这是错误的。 (Java中的对象不是在一个线程运行。你可以说的是,一个方法是在从该方法被调用的线程中运行)

Android中(在大多数的UI框架)的规则这个:

你只能从UI线程调用一个方法更新UI。

如果你有一些代码在一个线程(不是UI线程)上运行,如果该代码需要更新UI:您可以使用UI线程的Handler发布UI更新代码到UI线程。如果当您发布某些内容以更新它的UI时,该活动不在前台:nevermind!您刚刚发布的代码将在未来的某个时间点执行。

1

  1. 从您的工作者类发送broadcastIntent并将BroadcastReceiver添加到您的活动中,当您收到正确的消息时,更新您的列表视图。

  2. 第二种方法是在你的活动延伸AsyncTask并在doInBackground()做你的工作,并在onPostExecute(result)更新您的列表视图中创建私有或公共类。

  3. 我可以想象的第三种方式,但我不认为这是创建静态方法的最佳方式,您可以从任何其他类中使用它来更新UI。

您至少在我看来可以用在这里的最好的东西是AsyncTask

相关问题