Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用不同线程自动更新UI_Java_Android_Multithreading - Fatal编程技术网

Java 使用不同线程自动更新UI

Java 使用不同线程自动更新UI,java,android,multithreading,Java,Android,Multithreading,我有一个Android应用程序,它不断自动更新来自应用程序SQLite的数据列表,其中ArrayAdapter用于处理数据,因此为此,我从Acitivity的onCreate方法中创建了另一个线程或处理程序,在它的代码中有一个不断更新然后等待的循环(或让线程休眠片刻,ex/10秒),涉及两个问题: 1-只有UI线程可以触摸它的视图(尽管我只触摸了ArrayAdapter,如果它算作视图)。 2-一旦另一个线程开始运行,UI线程似乎卡在其中,甚至第一次UI更新都不会更新(完全白色)。 autoUp

我有一个Android应用程序,它不断自动更新来自应用程序SQLite的数据列表,其中ArrayAdapter用于处理数据,因此为此,我从Acitivity的onCreate方法中创建了另一个线程或处理程序,在它的代码中有一个不断更新然后等待的循环(或让线程休眠片刻,ex/10秒),涉及两个问题: 1-只有UI线程可以触摸它的视图(尽管我只触摸了ArrayAdapter,如果它算作视图)。 2-一旦另一个线程开始运行,UI线程似乎卡在其中,甚至第一次UI更新都不会更新(完全白色)。 autoUpdate()方法的代码:(在UI onCreate方法的最后一行调用):

或:


这两种方法都不管用。

你可以用很多方法。但这一种方法与你所做的更接近

private void runThread() {

    new Thread() {
        public void run() {
            while (continueAutoUpdate) {
                try {
                    handler.postDelayed(new Runnable(){
                        public void run(){
                            Log.e("updating...", "");
                            updateLogFromDatabase();
                        }
                    }, milliseconds);
                    Thread.sleep(milliseconds);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}

你可以用很多方法,但这一种方法更接近于你所做的

private void runThread() {

    new Thread() {
        public void run() {
            while (continueAutoUpdate) {
                try {
                    handler.postDelayed(new Runnable(){
                        public void run(){
                            Log.e("updating...", "");
                            updateLogFromDatabase();
                        }
                    }, milliseconds);
                    Thread.sleep(milliseconds);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}

在尝试了各种方法之后,我终于找到了解决方案:只要您有一些长期运行的任务要执行,您就可以分配一个新的Java线程来执行它,但是当需要从该线程更新UI时,该线程不能直接访问UI的任何组件,因此在这种情况下,您只需要用runOnUiThread()包装代码在另一个线程内/

private void startAutoUpdateLogData(final int milliseconds) {
    final Handler handler = new Handler();
    continueAutoUpdate = true;

    new Thread() {
        public void run() {
            while (continueAutoUpdate) {
                try {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.e("updating...", "");
                            updateLogFromDatabase();
                        }
                    });
                    Thread.sleep(milliseconds);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}

在尝试了各种方法之后,我终于找到了解决方案:只要您有一些长期运行的任务要执行,您就可以分配一个新的Java线程来执行它,但是当需要从该线程更新UI时,该线程不能直接访问UI的任何组件,因此在这种情况下,您只需要用runOnUiThread()包装代码在另一个线程内/

private void startAutoUpdateLogData(final int milliseconds) {
    final Handler handler = new Handler();
    continueAutoUpdate = true;

    new Thread() {
        public void run() {
            while (continueAutoUpdate) {
                try {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.e("updating...", "");
                            updateLogFromDatabase();
                        }
                    });
                    Thread.sleep(milliseconds);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}

第一:如果你的代码不起作用,那么很可能是因为你的
updateLogFromDatabase
实现有缺陷。第二:无休止的
sleep
循环非常糟糕-那就是忙着等待。无论你在哪里写入数据库,都会创建一个“脏”循环发出信号或尝试使用SQLite系统在数据更改时获得通知。第二个和第三个解决方案while loop会阻止主UI线程,因为runOnUIThread将在主线程上运行。正如预期的那样。@Robert updateLogFromDatabase()非常安全,使用每10秒自动更新的另一个原因是从现在开始更新显示更新时间(ex/1小时前,刚刚……)。如果没有数据库更改,仍然每10秒更新一次显示日期时间。@lib4是的,你是对的,应该有另一个解决方案。第一:如果你的代码不起作用,那么很可能是因为你的
updateLogFromDatabase
实现有缺陷。第二:无休止的
睡眠循环非常糟糕-这就是busy正在等待。无论您在何处写入数据库,都会创建一个“脏”信号,或者尝试使用SQLite系统在数据更改时获取通知。第二个和第三个解决方案while loop会阻止主UI线程,因为RUNNUITHREAD将在主线程上运行。正如预期的那样。@Robert updateLogFromDatabase()非常安全,使用每10秒自动更新的另一个原因是从现在开始更新显示更新时间(例如/1小时前,刚刚…)。如果数据库没有更改,仍然每10秒更新一次显示日期时间。@lib4是的,你是对的,应该有另一种解决方案。是不是一样?甚至将等待时间增加一倍。这不一样,请仔细查看。这不是你在问题中提供的任何解决方案。你应该尝试一下。拜托,我没有使用rUnoithRead您到底得到了什么错误?请发布updateLogFromDatabase()的代码;请解释您得到了什么错误。白色屏幕(不构建初始UI),这表示主ui线程被卡住且仍在循环中。速度可以通过处理程序中提供的毫秒来控制,为快速响应提供更短的时间。处理处理处理程序总是更好。并且您可以控制发送给处理程序的请求数,并决定对哪个请求进行操作,忽略哪个请求。不要给出任何提示延迟到处理程序,那么它将与uiThread一样快。这不一样吗?甚至是等待时间的两倍。这不一样,请仔细查看。这不是您在问题中提供的任何解决方案。您应该尝试一下。请注意,我没有使用RunonUithRead。您得到的错误到底是什么?请发布updateLogFromDatabase()的代码,请解释您遇到的错误。白色屏幕(不构建初始用户界面),这表示主ui线程被卡住且仍在循环中。速度可以通过处理程序中提供的毫秒来控制,为快速响应提供更短的时间。处理处理处理程序总是更好。并且您可以控制发送给处理程序的请求数,并决定对哪个请求进行操作,忽略哪个请求。不要给出任何提示延迟到处理程序,然后它将与uiThread一样快。
private void startAutoUpdateLogData(final int milliseconds) {
    final Handler handler = new Handler();
    continueAutoUpdate = true;

    new Thread() {
        public void run() {
            while (continueAutoUpdate) {
                try {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Log.e("updating...", "");
                            updateLogFromDatabase();
                        }
                    });
                    Thread.sleep(milliseconds);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }.start();
}