【问题标题】:How to use PendingResult to make Network call Synchronously如何使用 PendingResult 同步进行网络调用
【发布时间】:2017-04-12 07:26:57
【问题描述】:

在应用程序启动时,我点击一个服务来获取一些数据/提要,如果从这个请求中获取的数据取决于应用程序的大部分部分。

我已经检查了 Google 对跟踪代码管理器的实施。他们使用PendingResult来阻塞线程,除非时间或网络请求完成。

我也在尝试使用相同的方法,但没有太多关于 PendingResult 实际工作原理的教程。我已经完成了以下操作。

  if(aManager.getContainer() == null){
        PendingResult pending= aManager.init();
        pending.await(10, TimeUnit.SECONDS);
    }


    **In AManager Class**




public PendingResult init(String containerID){

    DatabaseHandler db = new DatabaseHandler(context);
    fetchType= db.getFetchMode();
    this.containerID= containerID;

    if(fetchType== 0){
        refresh();
    }

        return null;
    }

我返回 null 因为我无法理解如何返回 PendingResult 对象?

on refresh();我使用 volley 发出网络请求

【问题讨论】:

  • PendingResult?你不是说android.content.BroadcastReceiver.PendingResult 吗?那么PendingResult是什么意思?
  • @pskink 我希望 `pending.await(10, TimeUnit.SECONDS);` 等待 10 秒,或者除非我得到服务的响应,一旦我得到结果,我希望应用程序执行其他任务.我不太了解PendingResult,但我查看了 TagManager 示例,它使用 PendingResult 来执行此操作。
  • PendingResult 的全类名称是什么?
  • @pskink public class AManager{ public PendingResult init(String containerID){} }
  • 如果您有 String 类,则完整的类名是 java.lang.String,对于 Activity 类,它是 android.app.Activity,所以我的问题是:@987654334 的完整类名是什么@?

标签: java android performance android-layout android-fragments


【解决方案1】:

在调用服务之前启动一个带有加载指示器的 ProgressDialog。 ProgressDialog 将阻止 UI。服务完全执行后,您使用 eventBus 将事件发布到您的活动,然后从该事件中关闭加载指示器。

请看下面的代码来显示进度对话框:

public static MaterialDialog showProgressDialog(Context context) {
        if (null != context) {

            MaterialDialog.Builder builder = new MaterialDialog.Builder(context)
                    .content("Loading...")
                    .theme(Theme.LIGHT)
                    .widgetColorRes(color.progress_dialog_theme)
                    .progress(true, 0);

            MaterialDialog dialog = builder.build();
            dialog.setCancelable(false);
//            dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            dialog.show();
            dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {

                @Override
                public boolean onKey(DialogInterface dialog, int keyCode,
                                     KeyEvent event) {
                    if (keyCode == KeyEvent.KEYCODE_SEARCH
                            && event.getRepeatCount() == 0) {
                        return true;
                    }
                    return keyCode == KeyEvent.KEYCODE_MENU;
                }

            });
            return dialog;
        }
        return null;
    }

【讨论】:

  • @Kirmani88 如果您能够解决,请将其标记为答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 2015-08-25
  • 1970-01-01
相关资源
最近更新 更多