我的简单应用设置为在点击Refresh
按钮时检索RSS Feed
单击刷新按钮会启动AsyncTask
,以检索Feed。 AsyncTask
是主要活动的子标记。
这是我班级的样子:
public class NasaDailyImage extends Activity{
public ProgressDialog modalDialog = null; //problematic
//------------------------------------------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState){
//instantiate the ProgressDialog
Button b = //get reference to button
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
modalDialog.show(); // show modal
Toast.makeText(getApplicationContext(), "Getting feeds", 500).show();
new AsyncRetriever().execute(new IotdHandler()); // Get the feeds !!
}
});
}
//------------------------------------------------------------------------------
public synchronized void resetDisplay(boolean parseErrorOccured,
boolean imageErrorOccured,
IotdHandler newFeeds){
if(parseErrorOccured || imageErrorOccured){
// make a Toast
// do not update display
}else{
// make a Toast
// update display
// based on new feed
}
}
//------------------------------------------------------------------------------
class AsyncRetriever extends AsyncTask<IotdHandler,Void,IotdHandler>{
@Override
protected IotdHandler doInBackground(IotdHandler... arg0) {
IotdHandler handler = arg0[0];
handler.processFeed(); // get the RSS feed data !
return handler;
}
//------------------------------------------------------------------------------
@Override
protected void onPostExecute(IotdHandler fromInBackground){
resetDisplay( // call to update the display
fromInBackground.errorOccured,
fromInBackground.imageError,
fromInBackground);
}
//------------------------------------------------------------------------------
}
问题在于show()
中modalDialog
的{{1}}。这导致我的应用程序崩溃。 为什么?和如何解决?
答案 0 :(得分:2)
ProgressDialog
null
为NPE
,因此当您致电show()
时,您会 @Override
protected void onCreate(Bundle savedInstanceState){
//instantiate the ProgressDialog
// can set message, title, etc. here
Button b = //get reference to button
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
modalDialog = ProgressDialog.show(NasaDailyImage .this, "Enter Title", "Enter Message");
。在调用方法之前实例化它。
可能在某处像这里实例化它然后在显示之前设置消息,标题,你想要的任何东西
{{1}}
答案 1 :(得分:2)
无法在后台线程上更新ui。在后台线程上调用doinBAckground。您应该使用进度对话框来显示Async Task,然后您可以更改用户界面(UI)中的任何内容。
第1步:首先初始化您的进度对话框。
ProgressDialog progressDialog;
步骤2:然后在进度对话框开始之下启动doBackground工作。
progressDialog = ProgressDialog.show(Activity1.this, "",
"Loading...");
步骤3:完成工作后,最后关闭进度对话框。
progressDialog.dismiss();
在进度平均时间对话框中,您可以更改任何ui
答案 2 :(得分:1)
您需要实例化ProgressDialog:
modalDialog = ProgressDialog.show(this, null, "Please, wait...");