如何在后退按钮被击中后停止while循环

时间:2015-05-08 13:18:41

标签: java android multithreading loops while-loop

我已经尝试了很多方法来解决我的问题,但仍然没有成功。我有一个方法,它返回一个字符串值,我用它来更新我的屏幕上的TextView,如下所示: outCPU.setText(getCpuInfo());

哪个没问题,但我需要更新此TextView,直到按下后退按钮。

我想我需要一个while循环,它在创建活动后启动,并在按下后退按钮后停止。这个循环应该在一个新的线程中,因为: - 我必须首先加载活动并在另一个线程中执行循环,这样执行不会影响主线程和活动的加载。

正如我已经说过的那样,即使我花了几个小时,我也不知道如何正确地做到这一点。

有人能告诉我一个如何完成这个工作的例子吗?感谢... !!

已编辑 - 工作:

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

}

2 个答案:

答案 0 :(得分:3)

您可以使用AsyncTask在线程中对UI线程执行操作。或者你可以使用我最喜欢的' ,ThreadHandler的组合。要确保在按下后退时线程停止,您可以使用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();

}

答案 1 :(得分:0)

在应用中的某处使用共享标记:

private volatile boolean wasPressed = false;

在while循环中,检查此标志:

while (!wasPressed) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            outCPU.setText(getCpuInfo()); 
        }
    });
    // sleep for a while
}

在按钮上单击侦听器,将wasPressed切换为true