将消息发送回主线程

时间:2014-08-31 15:13:46

标签: android multithreading android-handler

我制作了一个应用程序,用于检查我的三星设备中的可用RAM。我希望每两秒更新一次值。

我把它放在后台线程中,我不知道如何将计算出的值发送回主线程。我想我的处理程序类是必要的,但不知道如何实现它

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();

}

2 个答案:

答案 0 :(得分:0)

与UI Thread同步的简便方法是:

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

答案 1 :(得分: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

            }
        });
}