2014-08-31 3 views
1

Я сделал приложение, которое проверяет наличие ОЗУ в моем устройстве samsung. Я хочу, чтобы значение обновлялось каждые две секунды.Отправить сообщение backto mainthread

Я поместил это в фоновый поток, и я не знаю, как отправить вычисленное значение обратно в основной поток. Я предполагаю, что обработчик класса является необходимым, но не знаю, как реализовать это

private TextView tv; 
private Handler handler; 
private long availableMegs; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    tv = (TextView) findViewById(R.id.meminfo_view); 
    tv.setText("TILLGÄNGLIGT RAM = " + availableMegs); 

    Thread t = new Thread(new Runnable() { 

     @Override 
     public void run() { 

      while (true) { 

       MemoryInfo mi = new MemoryInfo(); 
       ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
       activityManager.getMemoryInfo(mi); 
       long availableMegs = mi.availMem/1048576L; 

       tv.setText("TILLGÄNGLIGT RAM = " + availableMegs); 
       try { 
        Thread.sleep(2000); 
       } catch (InterruptedException ie) { 
        //... 
       } 
      } 
     } 

    }); 

    t.start(); 

} 

ответ

0

Простой способ синхронизироваться с UI Тема будет:

tv.post(new Runnable() { 
     @Override 
     public void run() { 
      tv.setText("TILLGÄNGLIGT RAM = " + availableMegs); 
     } 
}); 
+0

спасибо - но все, что я получаю, это пустой экран – bjha

0

В этом случае я хотел бы предложить принять подход Listener. Вы можете создать интерфейс:

public interface OnMemoryListener{ 

    public void onMemoryReceived(String value); 
} 

Создать отдельный класс, расширяющий Thread, чтобы сохранить код в чистоте:

public static class MemoryThread extends Thread{ 

    private OnMemoryListener listener; 

    public MemoryThread(OnMemoryListener l){ 
     super(); 
     listener = l; 
    } 

    @Override 
    public void run() { 

     // execute memory code 

     if(listener != null) 
      listener.onMemoryReceived(value); 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException ie) { 
      //... 
     }   
     super.run(); 
    } 

} 

Сделайте свою деятельность осуществлять OnMemoryListener и обеспечить необходимый код для обработки результат. Если вы хотите запустить код слушателя в основном потоке, вы можете использовать метод activitiy runOnUiThread().

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    MemoryThread mt = new MemoryThread(this); 
    mt.start(); 
} 

@Override 
public void onMemoryReceived(final String value){ 

     runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       // handle the result here 

      } 
     }); 
} 
Смежные вопросы