用于处理多线程的Android活动

时间:2011-11-13 20:32:06

标签: android multithreading button asynchronous

在我的活动课程中,我想执行一系列长时间计算,按下按钮需要大约5秒才能完成。所以为了做到这一点,我创建了一个新的类,它在其run方法中执行所有计算(因为它实现了Runnable),并且在完成后我将变量设置为true来指示。在检查是否按下按钮的代码中,我启动一个新的Thread传递我的类,然后检查run方法是否已经完成。如果它完成了我然后打印数据。这个问题是当我检查计算是否已经完成时,它们实际上没有通过那行代码并且从不打印数据。我试过做异步类方法,但我认为它不会工作。有没有办法在按下按钮时创建线程,并继续检查是否已完成,以便我可以打印数据? Activity中的哪一段代码实际上是一次又一次地被执行?感谢您提供任何信息。

if(v.equals(this.button)) {
             EditText param1 =  (EditText)findViewById(R.id.param1);
             EditText param2 = (EditText)findViewById(R.id.param2);

            calculations = new MathCalc(param1.getText().toString(), param2.getText().toString());

            new Thread(calculations).start();

            while(!calculations.isReady());

            Intent intent = new Intent(this,Show.class);
            intent.putExtra("show1", calculations.getResult());
            startActivity(intent);

            }

这是我想要实现的目标。

3 个答案:

答案 0 :(得分:3)

AsyncTask是适合此的工具。 AsyncTask的典型用例是,您希望在后台执行一些小操作,并在任务完成之前,期间和/或之后通过UI留下反馈。

请注意,如果用户退出并重新启动您的活动,后台运行会让您遇到麻烦,因为当从屏幕上删除活动时后台任务不会结束。

示例活动如下所示。您可以将onPreExecuteonProgress方法添加到AsynchTask中,以便在计算之前和计算过程中向用户提供反馈。

    public class CalcActivity extends Activity {
    private Button button;
    private TextView resultView;

    public void onCreate() {
        button = (Button) findViewById(R.id.my_button);
        resultView = (TextView) findViewById(R.id.result);
        button.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                button.setEnabled(false);
                AsyncCalculation calc = new AsyncCalculation();
                calc.execute();
            }
        });
    }

    public class AsyncCalculation extends AsyncTask<Void, Void, Integer> {

        @Override
        protected Integer doInBackground(Void... params) {
            int result = 0;
            // Do some calculation
            return result;
        }

        @Override
        protected void onPostExecute(Integer result) {
            // Set the result, start another activity or do something else
            resultView.setText("The result was " + result);
            button.setEnabled(true);
        }

    }

}

答案 1 :(得分:2)

我不知道这对AsyncTask不起作用。您基本上需要覆盖两种方法 - doInBackground()onPostExecute()。 您可以保证在后台计算完成后将在UI线程上调用onPostExecute()。您也不必担心如何从另一个线程更新UI线程。

这是一个很好的example

答案 2 :(得分:1)

使用

Button someButton = (Button) findViewById(R.id.favouriteButton);
someButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {

                Thread thread = new Thread(new Runnable() {
                       @Override
                        public void run() {

                            while(!isDone){
                               doAlotOfCalculations();
                            }
                        }
                });
                thread.start();
              } 
});




private void doAlotOfCalculations(){
    ...    
    if(whenDone){
        isDone = true;
    }
    ....
}
  

Activity中的哪一段代码实际上是通过和执行的   又一次?

没有这样的事情。 每次启动(重新启动)此活动时都会执行onResume