如何在Android中的AsyncTask doInBackground()方法中同步语句

时间:2012-04-27 12:56:56

标签: android android-asynctask

我写了如下代码

公共类SplashScreen扩展了BaseActivity {

public void onCreate(Bundle savedInstanceState){        
  super.onCreate(savedInstanceState);
  new DownloadPlistTask().execute("background","Progress","yes");
}
private class DownloadPlistTask extends AsyncTask<String,String,String>{


 protected String doInBackground(String... dummy){
     return compareLocRemPlist();
 }
    protected void onProgressUpdate(String... progress){
      //some code here.
    }

  protected void onPostExecute(String result){
   //handle return type from doInBackground.
  }

 public String compareData(){
     final Timer timer = new Timer();
     timer.schedule( new TimerTask(){
       public void run(){
        //code regarding webservices.
        if(boolValue){
         //if the boolValue from the webservice is true,cancel the timer.
          timer.cancel();
          }
     },5*60*1000,5*60*1000);
     return "finish";
  }
 }  
}

在上面的代码来自onCreate()iam在doInBackground中调用AsyncTask doInBackground iam调用一个名为compareData()的方法。在compareData()方法中,我使用一个timer。计时器在webservice中发送对webservice的请求我得到一个布尔值,如果它是真的我需要返回完成。如果它是假的我不想返回完成,我应该留在compareData()方法,并且每五分钟它应该发送请求,直到我得到true。但是当计时器等待五分钟时,在此期间计时器被取消后的语句和返回值完成返回到doInBackground并且控件将转到onPostExecute()但是在后台计时器正在运行。当我取消计时器时,可以返回完成

1 个答案:

答案 0 :(得分:2)

由于您在doInBackground中运行它,因此您可以同步执行检查。因此,您可以使用Thread.sleep方法而不是计时器。

static final long RETRY_DURATION = 5*60*1000;
public String compareData(){
    boolean boolValue = false;
    do{
        //code regarding webservices.
        if(!boolValue){
            try{
                Thread.sleep(RETRY_DURATION);
            }catch(InterruptedException ex){
                ex.printStackTrace();
            }
        }
    }while(!boolValue);
    return "finish";
}