[英]Call adapter.notifyDataSetChanged() from another thread
我想从另一个线程调用adapter.notifyDataSetChanged()
。 我读到我应该使用AsyncTask
并在执行后执行adapter.notifyDataSetChanged()
。
我必须仅对当前活动(可能是父活动或子活动)每5秒执行一次AsyncTask
因为只有一个活动可以同时执行asynctask。
我是否应该创建一个TimerTask
每5秒执行一次AsyncTask
,在启动另一个活动时将其停止并在onResume
重新启动它?
这是我的线程代码,用于更新当前Activity的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();
}
现在,当添加新用户时,我必须能够更新子活动的ListViews
。
您应该使用下面的链接中的timertask: https ://examples.javacodegeeks.com/android/core/activity/android-timertask-example/
如果您位于其他线程(如AsyncTask的doInBackground)中,则代码将在UIThread上发布任何更改:
runOnUiThread(new Runnable() {
@Override
public void run() {
// Here you can set your Ui Components
}
});
一种可能的方式是在两个活动中都创建一个标志来控制线程的运行(以下代码不可运行,仅是示例,以了解您可以执行的操作):
Activity A
{
public static boolean stopThread = false;
@Override
public void onResume()
{
super.onResume();
// put your code here...
stopThread =false;
runEventHandler();
}
private void runEventHandler() {
new Thread() {
public void run() {
while (A.stopThread != false) {
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();
}
@Override
protected void onStop(){
super.onStop();
stopThread =true;
}
}
Activity B
{
public static boolean stopThread = false;
@Override
public void onResume()
{
super.onResume();
// put your code here...
stopThread =false;
runEventHandler();
}
private void runEventHandler() {
new Thread() {
public void run() {
while (B.stopThread != false) {
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();
}
@Override
protected void onStop(){
super.onStop();
stopThread =true;
}
}
您也可以使用onPause()
代替onStop()
。 取决于您的程序概念。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.