我的 android 应用程序设置为在收到来自服务器的通知时从服务器获取数据。此通知包含一个 ID,用于查询服务器和下载数据。然而问题是,如果用户在数据下载之前点击通知,就会出现空指针异常。
我正在寻找用户友好的方式来管理它,理想情况下,如果用户在下载数据之前点击它,那么会出现一个加载符号,直到它被下载。
我没有这样做的具体想法,有没有关于这个问题的教程/示例代码?我想我需要使用监听器?
谢谢!
这是一种方式:
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()
方法ProgressDialog
(这ProgressDialog
应该在实例变量中创建,因此您可以跟踪它并可以cancel()
从任何地方调用)然后显示您现在将使用数据显示的任何内容有。
AsyncTaskListener
另外,由于您的下载是一个后台进程,您可以使用观察者模式(侦听器模式),您的活动将在其中实现一个接口,假设AsyncTask
您的下载后台进程的类的名称在哪里,这个接口应该有方法Activity 将调用后台进程,假设cancelProgressDialog()
将在onPostExecute()
您的AsyncTask
类中调用类似的方法,您需要做的最后一件事是在 AsyncTask 类中创建接口的实例变量(成员),也许通过Constructor
或方法将Setter
接口设置为它。这是一个例子:
界面:
public interface MessageHandlerListener {
public void toastMessage(int messageId);
}
活动:
public class AnyActivityThatNeedsToShowAMessageInABackgroundProcessOrInUIThread extends Activity implements MessageHandlerListener {
public void toastMessage(int messageId){
//show a toast implementation
}
}
异步任务:
public class BackgroundProcess extends AsyncTask {
MessageHandlerListener mMessageHandlerListener;
public BackgroundProcess(MessageHandlerListener m){
mMessageHandlerListener = m;
}
protected Object doInBackground(Object[] objects){
return null
}
protected void onPostExecute(Object o) {
mMessageHandlerListener.toastMessage(Message.CONSTANT_MESSAGE);
}
}
这是一种更好的方法,让您在 android 中应用 MVC 模式,您的后台进程可以是控制器,您的 Activity(s) 是视图,并且根据项目的需要有一个好的模型。问候。