我的Android应用程序设置为从服务器收到通知时从服务器获取数据。此通知包含用于查询服务器和下载数据的ID。但问题是,如果用户在下载数据之前单击通知,则会出现空指针异常。
我正在寻找用户友好的方式来管理这个,理想情况是如果用户在下载数据之前点击这个,那么在下载之前会出现一个加载符号。
我没有这样做的具体想法,是否有关于此问题的任何教程/示例代码?我想我需要使用听众?
谢谢!
答案 0 :(得分:1)
这是一种方式:
public void showProgressDialog() {
runOnUiThread(new Runnable() {
public void run() {
mProgressDialog = onCreateProgressDialog();
mProgressDialog.show();
}
});
}
private ProgressDialog onCreateProgressDialog() {
ProgressDialog dialog = new ProgressDialog(RequesterActivity.this);
dialog.setTitle(getString(R.string.label_dialog_item_to_find) +" "+
((EditText) findViewById(R.id.edit_text_item_id)).getText().toString());
dialog.setMessage(getString(R.string.label_dialog_finding_item));
dialog.setIndeterminate(true);
dialog.setCancelable(false);
return dialog;
}
请注意,您可以在此对话框中添加“无风格”,例如Dialog with transparent background in Android或此处android dialog transparent,具体取决于您的需要。
另一方面,我使用ProgressDialog
中的一些信息,例如"Please wait while loading item..."
。从服务器获取数据后,只需调用显示cancel()
的{{1}}方法(此ProgressDialog
应在实例变量中创建,因此您可以跟踪它并且可以从任何地方拨打ProgressDialog
,然后显示您将使用现有数据显示的内容。
作为一个优点,由于您的下载是后台进程,您可以使用观察者模式(侦听器模式),您的Activity将在其中实现一个让我们说cancel()
的接口,其中AsyncTaskListener
是其名称在下载后台进程的类中,此接口应该具有Activity将在后台进程上调用的方法,让我们说AsyncTask
之类的方法将在cancelProgressDialog()
onPostExecute()
中调用} class,您需要做的最后一件事是在AsyncTask类中创建接口的实例变量(成员),并且可以通过AsyncTask
或Constructor
方法设置接口。
这是一个例子:
接口:
Setter
的活动:
public interface MessageHandlerListener {
public void toastMessage(int messageId);
}
的AsyncTask:
public class AnyActivityThatNeedsToShowAMessageInABackgroundProcessOrInUIThread extends Activity implements MessageHandlerListener {
public void toastMessage(int messageId){
//show a toast implementation
}
}
这是一种更好的方法,让你在android中应用MVC模式,你的后台进程可以是Controller,你的Activity是View,并且根据项目的需要有一个好的模型。问候。