如何使用PendingResult同步进行网络调用

时间:2017-04-12 07:26:58

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

关于应用程序启动i点击服务获取一些数据/提要,如果从此请求获取的数据依赖于大多数应用程序。

我已检查过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

发出网络请求

1 个答案:

答案 0 :(得分: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;
    }