2011-11-13 70 views
1

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

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

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

    } 

} 
+0

谢谢..我已经设法使用上面的代码。 –

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; 
    } 
    .... 
} 

实际上是克服执行哪一块的活动代码和 一遍又一遍?

有没有这样的事情。 这只是onResume它执行每次启动(重新启动)此活动

+0

感谢您的回复。这可能工作,但事情变得更复杂,因为当计算完成时,我可能想切换活动并传递一些值。 –

+0

@Stelios你想在另一项活动或某个课程中进行计算吗?你想把结果从一个活动传递给另一个吗?那么你应该使用意图或SharedPreferences – 2011-11-13 20:45:19

+0

是的,我正在做另一类中的计算,当我按下一个按钮,然后我需要现在当他们完成并通过getter访问它们。我正在使用一个意图,我已经通过值和evrything工作,但我已经通过启动线程(类本身)完成了这一点,并有一个while循环来检查它已完成。这使得hte应用程序没有响应,但是在3-4秒后它改变了活动并且数据在那里。我只是想在背景中做到这一点,所以它不会冻结。 –

2

我不明白这将不会与AsyncTask工作。您基本上需要重写两种方法 - doInBackground()onPostExecute()。 确保在后台计算完成后在UI线程上调用onPostExecute()。您也不必担心如何从另一个线程更新UI线程。

这是一个很好的example

+0

所以,如果我在AsyncTask类中创建类并在doBackroung()中调用计算,所有这些当我按下按钮时,我应该在postexecute中返回什么?因为它不会返回任何东西。我可能实际上在那里切换活动?如果我想将一些数据传递给主Activity,我应该将类传递给AsyncTask并访问/编辑这些数据? –

+1

仔细阅读文档。无论你在doInBackground()中返回什么,它都会自动作为参数传递给onPostExecute()。 – hovanessyan

+0

是的,你是对的。我错过了这一点。 –