Java 从另一个线程调用adapter.notifyDataSetChanged()

Java 从另一个线程调用adapter.notifyDataSetChanged(),java,android,multithreading,listview,android-asynctask,Java,Android,Multithreading,Listview,Android Asynctask,我想从另一个线程调用适配器.notifyDataSetChanged()。我读到我应该使用AsyncTask并在post execute中执行适配器.notifyDataSetChanged() 我必须仅对当前活动(可能是父活动或子活动)每5秒执行一次AsyncTask,因为只有一个活动可以同时执行AsyncTask 我是否应该创建一个TimerTask,每5秒执行一次AsyncTask,在启动另一个活动时停止它,并在onResume中重新启动它 下面是我的线程代码,该线程更新当前活动的List

我想从另一个线程调用
适配器.notifyDataSetChanged()
。我读到我应该使用
AsyncTask
并在post execute中执行
适配器.notifyDataSetChanged()

我必须仅对当前活动(可能是父活动或子活动)每5秒执行一次
AsyncTask
,因为只有一个活动可以同时执行AsyncTask

我是否应该创建一个
TimerTask
,每5秒执行一次
AsyncTask
,在启动另一个活动时停止它,并在
onResume
中重新启动它

下面是我的线程代码,该线程更新当前活动的
ListView

private void runEventHandler() {
    new Thread() {
        public void run() {
            while (true) {
                try {
                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            users.add(new User(10, "a", false));
                            adapter.notifyDataSetChanged();
                        }
                    });
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}

现在,我必须能够在添加新用户时更新子活动的列表视图。

您应该创建一个类似于下面链接中的timertask:

如果您处于不同的线程(如AsyncTask的doInBackground),则在UIThread上发布任何更改的代码:

runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                // Here you can set your Ui Components
                            }
                        });

您应该创建一个类似于下面链接中的timertask:

如果您处于不同的线程(如AsyncTask的doInBackground),则在UIThread上发布任何更改的代码:

runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                // Here you can set your Ui Components
                            }
                        });

一种可能的方法是,在这两个活动中都创建一个标志来控制要运行的线程(以下代码不可运行,只是为了理解您可以做什么):


您还可以使用
onPause()
而不是
onStop()
。取决于您的程序概念。

一种可能的方法是在两个活动中都创建一个标志,以控制要运行的线程(以下代码不可运行,只是为了了解您可以做什么):


您还可以使用
onPause()
而不是
onStop()
。取决于您的程序概念。

您可以使用runOnUiThread。有关更多信息,请查看它的工作原理,但在我启动子活动时,它会一直运行。如何停止它,然后重新启动它?或者,如果可能,我可以从线程更新子活动吗?您可以在线程中使用标志,并在它们之外更改标志以暂停或停止它们。如果你把你的代码放在这里,我可以帮助你更好。我添加了代码!例如,您的意思是您在活动“A”中,“runEventHandler()”函数是“A”函数,而在“A”中您调用“runEventHandler()”,并且您希望活动“B”中的列表会更新吗?我理解你的意思了吗?你可以使用runOnUiThread。有关更多信息,请查看它的工作原理,但当我开始儿童活动时,它会一直运行。如何停止它,然后重新启动它?或者,如果可能,我可以从线程更新子活动吗?您可以在线程中使用标志,并在它们之外更改标志以暂停或停止它们。如果你把你的代码放在这里,我可以帮助你更好。我添加了代码!例如,您的意思是您在活动“A”中,“runEventHandler()”函数是“A”函数,而在“A”中您调用“runEventHandler()”,并且您希望活动“B”中的列表会更新吗?我明白你的意思了吗?谢谢,我想我会用它的。但是,您不认为有比在需要更新的每个活动中创建线程更干净的方法吗?还有其他方法可以使适配器保持静态,并从后台运行的服务调用“notifyDataSetChanged”。谢谢,我想我会使用它。但是,您不认为有比在每个需要更新的活动中创建线程更干净的方法吗?还有其他方法可以使适配器保持静态,并从后台运行的服务调用“notifyDataSetChanged”。