我正在使用AsyncTask
发出网址请求,并希望在处理请求时显示某种进度微调器。 AsyncTask
类位于另一个扩展VerificationActivity
的活动Activity
中。应用程序在此行崩溃: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
问题,并运行了一个测试,使用doInBackground
方法在Thread.sleep()
方法中模拟了一些繁重的工作,但进度微调器仍未显示。有任何想法吗?
UPDATE2:
我设法显示我需要的进度对话框,但现在我无法解雇它。我认为这是因为我无法解除UI元素,我是否需要在runOnUIThread
内运行进度对话框?
答案 0 :(得分:1)
我假设您将活动作为上下文传递,并且当任务执行时,活动可能会消失,您将获得NullPointerException
,因此您有2个选项;
答案 1 :(得分:0)
嗨,请参阅下面更新的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);
}
}
答案 2 :(得分:0)
private Context context;
您已在此处定义了上下文,但未对其进行初始化。您可以通过构造函数
对其进行初始化 public SmsTask(Context con){
context = con;
}
当你调用SmsTask传递上下文时。
答案 3 :(得分:0)
您需要获取应用程序上下文 -
dialog = new ProgressDialog(getContext());