启动新线程时的黑色视图

时间:2013-04-01 07:35:38

标签: java android multithreading

在我的Android应用程序中,我希望每60秒自动刷新一次。所以我试着这样做:

public void refresh_check() {
        Thread myThread = new Thread()
        {
            int counter = 0;
            @Override
            public void run() {
                MyActivity.this.runOnUiThread(new Runnable(){
                    @Override
                    public void run() {
                        while (counter < 60) {
                            try {
                                Thread.sleep(1000);
                                counter += 1;
                                System.out.println("Counter: " + counter);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        refresh();
                    }});
                super.run();
            }
        };
        myThread.start();       
    }

这适用于将计数器打印到logcat的方式,但在我的应用程序中,我得到一个黑色视图。 refresh()只是一个带有http请求的函数,这个单独工作,所以错误必须在任何地方的线程中:/有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您没有正确使用Thread。在UI线程上运行长任务就像没有使用Thread一样。为了达到你的需要,你应该这样做:

public void refresh_check() {
        Thread myThread = new Thread()
        {
            int counter = 0;
            @Override
            public void run() {
                while (counter < 60) {
                            try {
                                Thread.sleep(1000);
                                counter += 1;
                                System.out.println("Counter: " + counter); //I think this may cause exception, if it does try removing it
                            } catch (InterruptedException e) { 
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                        refresh(); // In refresh(), use TextView.post(runnable) to post update the TextView from outside the UI thread or use handlers
                    }});
                super.run();
            };
        myThread.start();       
    }

另外,看看AsyncTask类,它使您能够在UI线程(doInBackground())之外运行长任务,并使用(onPostExecute()

的结果更新UI