繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM