2017-03-17 70 views
0

我使用Asynctasks來驗證EditTexts上的一些輸入,問題是,即使asinctasks在doinbackground()部分,當我按下下一個按鈕時,它將轉到下一個活動。我的問題是我使用asynctasks進行驗證。等待Asynctasks完成後再繼續新的活動

這裏是我的下一個按鈕代碼:

@Override 
public void onNextClicked(StepperLayout.OnNextClickedCallback callback) { 
    getData(); 
    new VerifyAppNameTask().execute(sAppName); 

    f2 = edtAppCategoryET(sAppCategory); 
    f3 = edtAppPlatformET(sAppPlatform); 
    f4 = edtAppDescriptionET(sAppDescription); 
    f5 = edtAppVersionET(sAppVersion); 

    if (!f1 && !f2 && !f3 && !f4 && !f5) 
    { 

     bundleData = new Bundle(); 
     bundleData.putString("appName", sAppName); 
     bundleData.putString("appCategory", sAppCategory); 
     bundleData.putString("appPlatform", sAppPlatform); 
     bundleData.putString("appVersion", sAppVersion); 
     bundleData.putString("appDescription", sAppDescription); 


     callback.goToNextStep(); 
    } 
    else 
    { 
     displaySnackBar("Cannot proceed. Please fix the errors.").show(); 
    } 

} 

而爲的AsyncTask:

class VerifyAppNameTask extends AsyncTask<String, Void, String> { 
    // use doInBackground() to make network calls, the returned value is 
    // sent to onPostExecute() 
    @Override 
    protected String doInBackground(String... data) { 

     if (data[0].replace(" ","").isEmpty()) 
     { 
      f1 = true; 
      return "1"; 
     } 
     else if (data[0].length() > 25) 
     { 
      f1 = true; 
      return "2"; 
     } 
     else if (checkAppName(data[0])) 
     { 
      f1 = true; 
      return "3"; 
     } 
     else 
     { 
      f1 = false; 
      return "4"; 
     } 


    } 
    @Override 
    protected void onPostExecute(String result) { 
     tilAppName.setErrorEnabled(true); 
     switch(result) 
     { 
      case "1": {tilAppName.setError("You can't leave this empty.");break;} 
      case "2": {tilAppName.setError("Maximum of 25 characters.");break;} 
      case "3": {tilAppName.setError("App Name already used.");break;} 
      case "4": {tilAppName.setError(null);tilAppName.setErrorEnabled(false);break;} 

     } 

    } 
} 

我需要的是,當我點擊下一步按鈕,就應該等待所有asynctasks完成第一。

回答

1
f2 = edtAppCategoryET(sAppCategory); 
    f3 = edtAppPlatformET(sAppPlatform); 
    f4 = edtAppDescriptionET(sAppDescription); 
    f5 = edtAppVersionET(sAppVersion); 

    if (!f1 && !f2 && !f3 && !f4 && !f5) 
    { 

     bundleData = new Bundle(); 
     bundleData.putString("appName", sAppName); 
     bundleData.putString("appCategory", sAppCategory); 
     bundleData.putString("appPlatform", sAppPlatform); 
     bundleData.putString("appVersion", sAppVersion); 
     bundleData.putString("appDescription", sAppDescription); 


     callback.goToNextStep(); 
    } 
    else 
    { 
     displaySnackBar("Cannot proceed. Please fix the errors.").show(); 
    } 

AsyncTaskonPostExecute添加此代碼,以便它可以提供幫助。 AsyncTask完成其任務後,此代碼運行。希望它可以幫助

+0

大。如果我有更多的Asynctask呢?和我的註冊頁面一樣,我有兩個以上的asynctasks,一個是學生證,電子郵件和用戶名。我需要創建asynctasks,以便我可以在檢查第一個edittext時將輸入添加到其他字段,而不是在繼續到另一個字段之前等待結果。 –

+0

@PaulJohnPulumbarit你可以按順序做。你也可以調用asynctak1並在asynctask1中依次調用asynctask2,最後在asynctask中添加你想要實現的代碼,在asynctask後執行 –

+0

好吧我試試吧。謝謝您的幫助! –

0

試試這個代碼:在你的ASYN

StepperLayout.OnNextClickedCallback mCallback; 

@Override 
    public void onNextClicked(StepperLayout.OnNextClickedCallback callback) { 
     mCallback = callback; 
     getData(); 
     new VerifyAppNameTask().execute(sAppName); 
    } 

private void yourMethod(){ 
    f2 = edtAppCategoryET(sAppCategory); 
    f3 = edtAppPlatformET(sAppPlatform); 
    f4 = edtAppDescriptionET(sAppDescription); 
    f5 = edtAppVersionET(sAppVersion); 

    if (!f1 && !f2 && !f3 && !f4 && !f5) 
    { 

     bundleData = new Bundle(); 
     bundleData.putString("appName", sAppName); 
     bundleData.putString("appCategory", sAppCategory); 
     bundleData.putString("appPlatform", sAppPlatform); 
     bundleData.putString("appVersion", sAppVersion); 
     bundleData.putString("appDescription", sAppDescription); 


     mCallback.goToNextStep(); 
    } 
    else 
    { 
     displaySnackBar("Cannot proceed. Please fix the errors.").show(); 
    } 
} 

class VerifyAppNameTask extends AsyncTask<String, Void, String> { 
    // use doInBackground() to make network calls, the returned value is 
    // sent to onPostExecute() 
    @Override 
    protected String doInBackground(String... data) { 

     if (data[0].replace(" ","").isEmpty()) 
     { 
      f1 = true; 
      return "1"; 
     } 
     else if (data[0].length() > 25) 
     { 
      f1 = true; 
      return "2"; 
     } 
     else if (checkAppName(data[0])) 
     { 
      f1 = true; 
      return "3"; 
     } 
     else 
     { 
      f1 = false; 
      return "4"; 
     } 


    } 
    @Override 
    protected void onPostExecute(String result) { 
     tilAppName.setErrorEnabled(true); 
     switch(result) 
     { 
      case "1": {tilAppName.setError("You can't leave this empty.");break;} 
      case "2": {tilAppName.setError("Maximum of 25 characters.");break;} 
      case "3": {tilAppName.setError("App Name already used.");break;} 
      case "4": {tilAppName.setError(null);tilAppName.setErrorEnabled(false);break;} 
     } 
     yourMethod(); 
    } 
} 
0
  1. 聲明一個布爾cTask名稱是「isFinish」。
  2. 將其設置在onPostExecute真()
  3. 檢查isFinish前開始下一個活動

這是我的樣本

nextButton.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      if (null != asyncTask && asyncTask.isFinished) { 
       startActivity(new Intent(MainActivity.this, 
         NextActivity.class)); 
      } 
     } 
    }); 
相關問題