【问题标题】:Loading/Listener screen while data downloads from Server从服务器下载数据时的加载/侦听器屏幕
【发布时间】:2013-08-08 20:19:09
【问题描述】:

我的 android 应用程序设置为在收到来自服务器的通知时从服务器获取数据。此通知包含一个 ID,用于查询服务器和下载数据。但问题是,如果用户在下载数据之前点击通知,就会出现空指针异常。

我正在寻找用户友好的方式来管理它,理想情况下,如果用户在下载数据之前点击它,那么在下载之前会出现一个加载符号。

我没有具体的想法,有没有关于这个问题的教程/示例代码?我想我需要使用监听器?

谢谢!

【问题讨论】:

  • 尝试实现自定义监听器

标签: android listener


【解决方案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() 显示的 ProgressDialog 方法(此 ProgressDialog 应在实例变量中创建,因此您可以跟踪它并可以从任何地方调用 cancel() ) 然后显示您将使用您现在拥有的数据显示的任何内容。

另外,由于您的下载是一个后台进程,您可以使用观察者模式(侦听器模式),您的活动将在其中实现一个假设AsyncTaskListener 接口,其中AsyncTask 是您下载的类的名称后台进程,这个接口应该有Activity会在后台进程上调用的方法,比如说像cancelProgressDialog()这样的方法,会在你的AsyncTask类的onPostExecute()中调用,最后你需要做的事情是在 AsyncTask 类中创建接口的实例变量(成员),并且可能通过ConstructorSetter 方法将接口设置为它。 这是一个例子:

界面:

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) 是视图,并且根据项目的需要有一个好的模型。问候。

【讨论】:

  • 你的英语很棒!非常感谢:)
  • 不客气,检查一下我修改的代码有什么问题:)
猜你喜欢
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
相关资源
最近更新 更多