使用其他线程

时间:2018-01-04 13:26:25

标签: java android multithreading

我有一个Android应用程序,它不断自动更新App的SQLite中的数据列表,ArrayAdapter用于处理数据,所以为此,我从Acitivity的onCreate方法创建了另一个线程或处理程序,在它的代码里面有一个连续的循环,用于更新然后等待(或暂停一段时间,ex / 10秒),涉及两个问题: 1-只有UI线程可以触摸它的视图(虽然我只触及ArrayAdapter,如果它被视为一个视图)。 2-一旦另一个线程开始运行,UI线程似乎卡在其中,即使第一次UI更新也不会更新(完全白色)。 autoUpdate()方法的代码:(在UI onCreate方法的最后一行调用):

public void startAutoUpdateLogData(final int milliseconds){
    continueAutoUpdate = true;
    new Thread(){
        @Override
        public void run() {
            while(continueAutoUpdate){
                try{
                    Log.v("updating..", "");
                    updateLogFromDatabase();
                    Thread.sleep(milliseconds);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
    }.start();
}

OR:

public void startAutoUpdateLogData2(final int milliseconds){
    continueAutoUpdate = true;
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            while(continueAutoUpdate){
                try{
                    Log.e("updating...", "");
                    updateLogFromDatabase();
                    Thread.sleep(milliseconds);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
    });
}

OR

public void startAutoUpdateLogData3(final int milliseconds){
    continueAutoUpdate = true;
    final Handler handler = new Handler();

    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            while(continueAutoUpdate){
                try{
                    handler.postDelayed(new Runnable(){
                        public void run(){
                            Log.e("updating...", "");
                            updateLogFromDatabase();
                        }
                    }, milliseconds);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }
    });
}

这些都不起作用。

2 个答案:

答案 0 :(得分:1)

你可以做很多事。但是这个将更加接近你所做的解决方案。

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();
}

答案 1 :(得分:1)

在尝试了各种各样的东西之后,我终于找到了解决方案:无论何时你都要执行一些长期任务,你可以分配一个新的Java线程来执行它,但是当需要更新UI时线程,它无法直接访问UI的任何组件,因此在这种情况下,您只需要在另一个线程中使用runOnUiThread()包装代码。 EX /

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();
}