解除ProgressDialog并从AsyncTask线程显示Toast

时间:2011-11-22 13:06:32

标签: android

这是我的类的构建方式的线框:

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中找到了我的第一个问题的解决方案。 我必须在ProgressDialog方法中显示onPreExecute

2 个答案:

答案 0 :(得分:3)

这是因为您尚未初始化progressDialog的{​​{1}}个对象。

正确执行此任务的方法:

  1. ProgressDialog onPreExecute()} AsyncTask。{/ li>
  2. ProgressDialog的{​​{1}}中做你的背景资料,例如。连接到webservice并获取结果或数据。
  3. doInBackground()的{​​{1}}中解除AsyncTask,然后执行所需的操作。
  4. 尝试使用以下代码..

    onPostExecute()

答案 1 :(得分: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();