1

我写了如下代码

公共类 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() 的代码中,我在 doInBackground 中调用了 AsyncTask doInBackground,在 doInBackground 中,我调用了一个名为 compareData() 的方法。在 compareData() 方法中,我使用了一个计时器。计时器发送了对 web 服务的请求,在 web 服务中,我得到了一个布尔值,如果为真,我需要返回完成。如果为假,我不想返回完成,我应该留在 compareData() 方法中,每五分钟它应该发送请求,直到我得到真。但是当计时器等待五分钟时,在此期间,计时器后的语句正在执行并且返回值完成返回到 doInBackground 并且控件将转到 onPostExecute() 但在后台计时器正在运行。当我取消计时器时如何返回完成

4

1 回答 1

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";
}  
于 2012-04-27T13:21:51.280 回答