2014-08-31 108 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 

      } 
     }); 
}