0

我有一个带有 Listview 和附加到它的适配器的活动。我有一个同步数据并保存它的类。(我认为我们不应该关心数据来自哪里)并且它在不同的线程上运行。现在我想知道更新适配器的干净方法,但是我们不应该从该类调用任何活动函数,因为它在不同的线程上运行。

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

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

4

4 回答 4

1

如果你想从另一个类更新你的 listView,你可以有几种方法来做到这一点。

  1. 从您的工作人员类发送广播意图并将广播接收器添加到您的活动中,当您收到正确的消息时,更新您的列表视图。

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

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

至少在我看来,你可以在这里使用的最好的东西是AsyncTask.

于 2013-01-24T11:09:43.357 回答
0

我们不应该从该类调用任何活动函数,因为它在不同的线程上运行。

那是错误的。(在java中一个对象没有在线程中运行。你可以说一个方法正在调用该方法的线程中运行)

在 Androïd(和大多数 UI 框架中)中,规则是这样的:

您只能从 UI 线程调用更新 UI 的方法。

如果您有一些代码在线程(不是 ui 线程)上运行,并且该代码需要更新 UI:您可以使用HandlerUI 线程将 UI 更新代码发布到 UI 线程。如果当您发布内容以更新其 UI 时活动不在前台:没关系!您刚刚发布的代码将在将来的某个时候执行。

于 2013-01-24T11:01:02.243 回答
0

这段代码会做你想做的事:

         runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    //your actions
                }
         });
于 2013-01-24T10:41:45.723 回答
0

你应该使用 AsyncTask,看看http://developer.android.com/reference/android/os/AsyncTask.html

于 2013-01-24T11:08:04.193 回答