2013-04-01 2 views
0

В моем приложении для 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, и это работает в одиночку, поэтому ошибка должна быть в потоке в любом месте:/Может ли кто-нибудь помочь?

+0

Зачем вы запускаете его в потоке пользовательского интерфейса? Это заблокирует работу. –

+0

Поскольку функция обновления вызывает некоторые другие функции, которые обновляют Textviews и т. Д. – Phil

+0

Вы можете использовать TextView.post (Runnable) для обновления TextViews вне потока пользовательского интерфейса. Или вы можете использовать AsyncTask для выполнения вашей обработки в doInBackground(), а затем обновить TextViews с результатами в onPostExecute() –

ответ

0

Вы не используете Thread правильно. Запуск длинных задач в потоке пользовательского интерфейса так же, как и без использования 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())