2011-11-22 30 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 –