我正在使用AsyncTask
进行url请求,并希望在处理请求时显示某种进度微调器。AsyncTask
类位于扩展Activity
的另一个活动VerificationActivity
中。应用程序在这一行崩溃:dialog = new ProgressDialog(context);
可能问题出在应用程序的context
上,我尝试了VerificationActivity.this
并创建了VerificationActivity
的本地实例,并将其作为上下文传递。
SmsTask smsTask = new SmsTask(VerificationActivity.this);
/*
* some code
*/
class SmsTask extends AsyncTask<String,Void, Boolean> {
final AtomicBoolean b = new AtomicBoolean(false);
private Context mContext;
ProgressDialog pd;
SmsTask(Context context){
this.mContext = context;
}
@Override
protected void onPreExecute(){
super.onPreExecute();
pd = new ProgressDialog(mContext);
pd.setProgressStyle(AlertDialog.THEME_HOLO_DARK);
pd.show(mContext,"Please wait","Sending...");
}
protected Boolean doInBackground(String... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(params[0]);
try {
httpclient.execute(httppost);
b.set(true);
} catch (IOException e) {
e.printStackTrace();
}
return b.get();
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
// result holds what you return from doInBackground
if(pd.isShowing()){
pd.dismiss();
}
Log.i("result from async: ",""+result);
}
}
这是我收到的错误消息:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference
更新:
我根据这里的答案修复了context
问题,并运行了一个测试,使用Thread.sleep()
方法模拟了doInBackground
方法内部的一些繁重工作,但进度微调器仍然没有显示。有什么想法吗?
更新2:
我设法根据需要显示了进度对话框,但现在我无法取消它。我想这是因为我无法取消UI元素,我需要在runOnUIThread
中运行进度对话框吗?
我假设您将活动作为上下文传递,在执行任务时,活动可能已经不存在,您将获得NullPointerException
,因此您有2个选项;
- 检查上下文-如果它为null,您可能根本不需要加载对话框
- 使用应用程序上下文
嗨,请参阅下面更新的AsynTas。
class SmsTask extends AsyncTask<String,Void, Boolean> {
final AtomicBoolean b = new AtomicBoolean(false);
private Context mContext;
private ProgressDialog dialog;
private SmsTask(Context context){
this.mContext = context;
}
@Override
protected void onPreExecute(){
super.onPreExecute();
Log.i("executing Pre - execute","");
dialog = new ProgressDialog(mContext );
dialog.setMessage("Loading...");
dialog.show();
}
protected Boolean doInBackground(String... params) {
//.... dosing stuff
return b.get();
}
@Override
protected void onPostExecute(Boolean result) {
if(dialog.isShowing()){
dialog.dismiss();
}
super.onPostExecute(result);
}
}
private Context context;
您在这里定义了上下文,但没有初始化它。您可以通过构造函数初始化它
public SmsTask(Context con){
context = con;
}
当您调用SmsTask时,将上下文传递给它。
您需要获取应用程序上下文-dialog = new ProgressDialog(getContext());