2011-11-22 31 views
1

這是我的課是如何構建的線框:解僱ProgressDialog和線程的AsyncTask顯示吐司

public class HelloWorldActivity extends Activity 
{ 
    private ProgressDialog progressdialog; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState);   
     setContentView(R.layout.main);   
    }  

    private class AuthenticateUserTask extends AsyncTask<Void,Void,String> 
    { 
     protected String doInBackground(Void... params) 
     { 
      //do something 
     } 

     protected void onPostExecute(String result) 
     { 
      if (result.equals("success")) 
       //do something 
      else 
      {    
       progressdialog.dismiss(); //this throws a null pointer exception 
       /* 
       When above line is commented to allow execution of app, Toast never shows on screen 
       however no errors are recorded in the log 
       */ 
       Toast.makeText(getApplicationContext(),"Login failed",Toast.LENGTH_SHORT); 
      } 
     }     
    } 

    public void login(View v) 
    {  
     progressdialog.show(HelloWorldActivity.this,"","Logging in...",true); 
     new AuthenticateUserTask().execute(); 
    } 
} 

對不起,如果它似乎我問一個線程兩個問題,但我懷疑兩者的解決方案都相似。

在onPostExecute:
1.如果登錄失敗,我做progressdialog.dismiss(),一個null pointer exception拋出和應用程序崩潰。
2.如果我刪除ProgressDialog並試圖顯示Toast,沒有顯示在屏幕上,但是沒有任何異常或錯誤要麼記錄。

編輯
我發現在另一個線程here解決我的第一個問題。 我必須在onPreExecute方法中顯示ProgressDialog

回答

1

爲了讓ProgressDialog顯示,覆蓋你的AsyncTask下面的方法:

protected void onPreExecute() { 
    progressdialog = ProgressDialog.show(HelloWorldActivity.this, "", "Logging in..."); 
} 

注:你需要刪除此從login()方法行:

progressdialog.show(HelloWorldActivity.this,"","Logging in...",true); 

Toast沒有顯示的原因是,你忘了打電話給.show()

Toast.makeText(getApplicationContext(),"Login failed",Toast.LENGTH_SHORT).show(); 
+0

獲取有關的AsyncTask信息哦天啊!你對'.show()'是正確的。嘆。謝謝! – xbonez

3

這是因爲你沒有初始化的ProgressDialogprogressDialog對象。完成這個任務的

正確方法:

  1. onPreExecute()AsyncTask開始ProgressDialog
  2. AsyncTaskdoInBackground()做你的背景的東西如。連接到webservice並獲得結果或數據。
  3. AsyncTaskonPostExecute()駁回ProgressDialog然後執行所需要的東西。

嘗試使用下面的代碼..

public class HelloWorldActivity extends Activity 
{ 
    private ProgressDialog progressdialog; 

    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState);   
     setContentView(R.layout.main);   
    }  

    private class AuthenticateUserTask extends AsyncTask<Void,Void,String> 
    { 

     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      super.onPreExecute(); 
      progressDialog== ProgressDialog.show(YourActivity.this, "","Logging In....", true); 
     } 


     protected String doInBackground(Void... params) 
     { 
      //Login Functionality 
     } 

     protected void onPostExecute(String result) 
     { 
      if(progressDialog.isShowing())     
        progressdialog.dismiss(); 

      if (result.equals("success")) 
       //do something 
      else 
      { 
       Toast.makeText(getApplicationContext(),"Login failed",Toast.LENGTH_SHORT).show(); 
      } 
     }     
    } 

    public void login(View v) 
    {  
     new AuthenticateUserTask().execute(); 
    } 
} 
+0

感謝詳細的解答。我在AsyncTask中定義了'progressdialog'範圍,雖然我意識到我不需要從外部調用它。我之前沒有考慮過使用'onPreExecute'。 – xbonez

+0

歡迎。您可以從http://developer.android.com/reference/android/os/AsyncTask.html –