这是我的类的构建方式的线框:
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
。
答案 0 :(得分:3)
这是因为您尚未初始化progressDialog
的{{1}}个对象。
正确执行此任务的方法:
ProgressDialog
onPreExecute()
} AsyncTask
。{/ li>
ProgressDialog
的{{1}}中做你的背景资料,例如。连接到webservice并获取结果或数据。doInBackground()
的{{1}}中解除AsyncTask
,然后执行所需的操作。尝试使用以下代码..
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();