如何在按下后退按钮后停止 while 循环
How to stop while loop after back button is hit
我已经尝试了很多方法来解决我的问题,但仍然没有 success.I 有一个方法,returns 我是一个字符串值,我用它来更新我屏幕上的 TextView 就像这个:
outCPU.setText(getCpuInfo());
这很好,但我需要更新此 TextView,直到按下后退按钮。
我想我需要一个 while 循环,它在 activity 创建后开始,在按下后退按钮后停止。这个循环应该在一个新线程中,因为:- 我必须先加载 activity 并在另一个线程中执行循环,这样执行就不会影响主线程和 activity 的加载。
正如我已经说过的,我不知道如何正确地做到这一点,即使我已经花了几个小时。
谁能告诉我如何完成此操作的示例?谢谢...!!
已编辑 - 工作:
private Handler mHandler;
private int i;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_systeminfo);
outCPU = (TextView) findViewById(R.id.outCPU);
outMEM = (TextView) findViewById(R.id.outMEM);
outTASKS = (TextView) findViewById(R.id.outTASKS);
i = 0;
mHandler = new Handler();
mHandler.post(mUpdate);
}
private Runnable mUpdate = new Runnable() {
@Override
public void run() {
outCPU.setText(getCpuInfo());
outMEM.setText(getMemInfo());
outTASKS.setText(getTasksInfo());
i++;
mHandler.postDelayed(this, 1000);
}
};
@Override
public void onBackPressed() {
mHandler.removeCallbacks(mUpdate);
super.onBackPressed();
Log.i("MSG", "Going back");
finish();
}
在您的应用中的某处使用共享标志:
private volatile boolean wasPressed = false;
在 while 循环中,检查这个标志:
while (!wasPressed) {
runOnUiThread(new Runnable() {
@Override
public void run() {
outCPU.setText(getCpuInfo());
}
});
// sleep for a while
}
在按钮点击侦听器上,将 wasPressed
切换为 true
。
您可以在线程中使用 AsyncTask
对 UI 线程执行操作。或者您可以使用 'my favorite',Thread
和 Handler 的组合。要确保线程在按下后退时停止,您可以使用 handler.removeCallBacks(Runnable)
以下示例可以解决您的问题:
//Global
Handler h = new Handler();
private static boolean flag = true;
public void updateTextView(){
// call thread here
h.post(thread);
}
// take this thread out side so that it can be stopped with handler
Thread thread = new Thread(){
public void run(){
while(flag)
outCPU.setText(getCpuInfo());
}
}
public void onBackPressed(){
flag = false;
h.removeCallBacks(thread);
super.onBackPressed();
}
我已经尝试了很多方法来解决我的问题,但仍然没有 success.I 有一个方法,returns 我是一个字符串值,我用它来更新我屏幕上的 TextView 就像这个:
outCPU.setText(getCpuInfo());
这很好,但我需要更新此 TextView,直到按下后退按钮。
我想我需要一个 while 循环,它在 activity 创建后开始,在按下后退按钮后停止。这个循环应该在一个新线程中,因为:- 我必须先加载 activity 并在另一个线程中执行循环,这样执行就不会影响主线程和 activity 的加载。
正如我已经说过的,我不知道如何正确地做到这一点,即使我已经花了几个小时。
谁能告诉我如何完成此操作的示例?谢谢...!!
已编辑 - 工作:
private Handler mHandler;
private int i;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_systeminfo);
outCPU = (TextView) findViewById(R.id.outCPU);
outMEM = (TextView) findViewById(R.id.outMEM);
outTASKS = (TextView) findViewById(R.id.outTASKS);
i = 0;
mHandler = new Handler();
mHandler.post(mUpdate);
}
private Runnable mUpdate = new Runnable() {
@Override
public void run() {
outCPU.setText(getCpuInfo());
outMEM.setText(getMemInfo());
outTASKS.setText(getTasksInfo());
i++;
mHandler.postDelayed(this, 1000);
}
};
@Override
public void onBackPressed() {
mHandler.removeCallbacks(mUpdate);
super.onBackPressed();
Log.i("MSG", "Going back");
finish();
}
在您的应用中的某处使用共享标志:
private volatile boolean wasPressed = false;
在 while 循环中,检查这个标志:
while (!wasPressed) {
runOnUiThread(new Runnable() {
@Override
public void run() {
outCPU.setText(getCpuInfo());
}
});
// sleep for a while
}
在按钮点击侦听器上,将 wasPressed
切换为 true
。
您可以在线程中使用 AsyncTask
对 UI 线程执行操作。或者您可以使用 'my favorite',Thread
和 Handler 的组合。要确保线程在按下后退时停止,您可以使用 handler.removeCallBacks(Runnable)
以下示例可以解决您的问题:
//Global
Handler h = new Handler();
private static boolean flag = true;
public void updateTextView(){
// call thread here
h.post(thread);
}
// take this thread out side so that it can be stopped with handler
Thread thread = new Thread(){
public void run(){
while(flag)
outCPU.setText(getCpuInfo());
}
}
public void onBackPressed(){
flag = false;
h.removeCallBacks(thread);
super.onBackPressed();
}