我制作了一个应用程序,用于检查我的三星设备中的可用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();
}
答案 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
}
});
}