2014-03-05 25 views
0

我正在創建我的應用程序的用戶註冊部分。我正在使用AsyncTask類在單獨的線程上處理此工作。我有我的AsyncTask類在一個單獨的類文件。這在單獨的公共asyncTask類的活動中顯示錯誤消息

public class CreateAccountTask extends AsyncTask<String, Void, String>{ 

private ProgressDialog mpDialog; 
private CreateAccountTask task; 
private Context context; 
private Activity activity; 
private CreateAccount createAccount; 
private AsyncTaskListener asyncTaskListener; 


public CreateAccountTask(Activity activity, AsyncTaskListener asyncTaskListener){ 

    this.activity = activity; 
    this.asyncTaskListener = asyncTaskListener; 
} 


@Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 

     mpDialog = new ProgressDialog(activity); 

     //mpDialog.setTitle("Creating Account"); 
     mpDialog.setMessage("Please wait."); 
     mpDialog.setCancelable(false); 
     mpDialog.setIndeterminate(false); 
     mpDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCEL", new DialogInterface.OnClickListener() { 

      @Override 
      public void onClick(DialogInterface arg0, int arg1) { 
       // TODO Auto-generated method stub 
       //task.cancel(true); 
       mpDialog.dismiss(); 

      } 
     }); 

     mpDialog.show(); 

    } 


@Override 
protected String doInBackground(String... arg0) { 
    // TODO Auto-generated method stub 

    String fphoneNo = arg0[1]; 
    String fpassword = arg0[0]; 

    // create instance of the parseUser Class 
    ParseUser newUser = new ParseUser(); 
    newUser.setUsername(fphoneNo); 
    newUser.setPassword(fpassword); 

    // here Check if progress dialog has been cancelled 

    if (!isCancelled()){ 

    // if dialog has not been cancelled create the new user here 
    newUser.signUpInBackground(new SignUpCallback() { 

     @Override 
     public void done(ParseException e) { 

        // Something went wrong Sorry! 

      if(e != null){ 


       if(!isCancelled()){ 
       mpDialog.dismiss(); 

       String errorMessage = e.getMessage().toString(); 

       ErrorHappened(errorMessage); 

       } 

       else{ 

        String errorMessage = "Registration Cancelled!"; 
        ErrorHappened(errorMessage); 

       } 

      } 

      // No Problems 
      else { 
       if (!isCancelled()) { 

        // Wait for five seconds before starting the activity 
        //verifyingUser(); 

       } 
       else { 
        String errorMessage = "Registration Cancelled2!"; 
        ErrorHappened(errorMessage); 

        //Delete user in background 
        ParseUser currentUser = ParseUser.getCurrentUser(); 
        if (currentUser != null) { 
         currentUser.deleteInBackground(); 
        } 

       } 
      } 

      } 

        }); 

    } 

    return null; 
} 

@Override 
protected void onPostExecute(String result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
    asyncTaskListener.onTaskComplete(result); 
} 

private void ErrorHappened(String errorMessage) { 

    Crouton CreateMagic = Crouton.makeText(createAccount, errorMessage, CroutonClass.ALERT); 
    CreateMagic.setConfiguration(CroutonClass.configure); 
    CreateMagic.show(); 


} 





} 

在我onPreExecute的方法,我開始progressDialog,顯示在正在執行的後臺任務。雖然在我的doInBackground方法我有我得到用戶在主要活動提供的用戶名和密碼,並註冊用戶。這是我的問題開始的地方,如果在用戶註冊過程中發生錯誤,我想使用Crouton(烤麪包機的冷卻器版本)通知用戶此錯誤。但是,當應用程序到達用於顯示錯誤的點時,該應用程序會崩潰。

我的問題是:

  1. 如何顯示在我的活動錯誤消息?
  2. 2.

這裏是我的活動:

public class CreateAccount extends ActionBarActivity implements AsyncTaskListener { 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_create_account); 


    mPassWord = (EditText) findViewById(R.id.password); 
    mcreateAccount = (Button) findViewById(R.id.createAcct); 
    mPhoneNumber = (EditText) findViewById(R.id.Phone_Number); 



    // create account Method 
    createAccount();  

    }//end of on create. 


    public void createAccount() { 

    mcreateAccount.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 


       CreateAccountTask newTask = new CreateAccountTask(CreateAccount.this, new CreateAccount()); 
       newTask.execute(passwordString, fpartphoneNo); 



      }); 

} 






private void verifyingUser() { 


} 

private void shitHappened(String errorMessage) { 
    // TODO Auto-generated method stub 


    Crouton CreateMagic = Crouton.makeText(this, errorMessage, CroutonClass.ALERT); 
    CreateMagic.setConfiguration(CroutonClass.configure); 
    CreateMagic.show(); 


} 


@Override 
public void onBackPressed() { 
    // TODO Auto-generated method stub 

    Crouton.cancelAllCroutons(); 
    super.onBackPressed(); 
} 








@Override 
public void onTaskComplete(String result) { 
    // TODO Auto-generated method stub 



} 

} 
+0

你不能內doInBackground做UI相關的工作()嘗試runOnUIThread或處理與UI工作。 – SathishKumar

+0

@sathish請不要理解。你能否用一個例子來解釋一下。 – KingBryan

回答

1

聲明和任何其他UI操作只從UIThread允許的。如果您查看AsyncTask的文檔,則doInBackground()在其自己的Thread上運行,而onPreExecute()onPostExecute()onCancelled()在UIThread上運行。

對於您的情況,您應該使用protected void onCancelled(String result)作爲通知。這在UIThread上運行,並幫助您區分成功和不成功的操作。要使用此功能,請撥打cancel()並檢查doInBackground()操作是否已取消。

onCancelled()將被轉而執行的onPostExecute()

在你的特殊情況下,它可能是上下文的問題,因爲你是存儲您的CreateAccount.this在你CreateAccountTaskactivity構造,但使用的是createAccount。嘗試將其更改爲以下:

​​
+0

對不起,這不是我遇到的問題。我試圖通知用戶界面發生了錯誤。我如何才能顯示消息。 – KingBryan

+0

檢查我編輯的編輯 –

+0

試過了。它不起作用。根據我的理解,onCancelled被調用時,由於某種原因線程被取消。我們舉例來說,我通過點擊進度對話框中的取消按鈕取消了任務,在我的doInBackground中,我檢查用戶是否取消了對話框,以便我可以停止該任務,然後使用此行顯示錯誤消息ErrorHappened (errorMessage)向用戶顯示註冊已被取消。但是,當它達到這一點時,應用程序崩潰。注意:如果asynctask是活動的內部類,它就可以完美工作 – KingBryan

0

使用runOnUiThread如下...

@Override 
protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    super.onPreExecute(); 

    runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 

      mpDialog = new ProgressDialog(activity); 

      //mpDialog.setTitle("Creating Account"); 
      mpDialog.setMessage("Please wait."); 
      mpDialog.setCancelable(false); 
      mpDialog.setIndeterminate(false); 
      mpDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCEL", new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 
        // TODO Auto-generated method stub 
        //task.cancel(true); 
        mpDialog.dismiss(); 

       } 
      }); 

      mpDialog.show(); 

    } 

}