2014-08-31 105 views
1

我做了一個應用程序,檢查我的三星設備的可用RAM。我希望該值每兩秒更新一次。發送消息回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 2014-08-31 15:29:22

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 

      } 
     }); 
}