【问题标题】:How to wait for intent service to finish - When the intent service is started from AsyncTask如何等待 Intent 服务完成 - 从 AsyncTask 启动 Intent 服务时
【发布时间】:2015-09-18 17:48:19
【问题描述】:

这是我的场景:

我有一个包含成员密钥字段的登录表单,一旦用户输入此密钥,我就会与服务器通信以进行身份​​验证。还有两个字段,即键和类型,我将它们添加到 JSON 对象中并将其发送到服务器。

现在由于一个请求,我还必须在一次调用中通过 GCM 令牌连同此登录信息一起发送。在提交按钮上单击我开始以下异步任务

我的后台操作方法如下所示:

  @Override
        protected String doInBackground(Void... params) {

            if (checkPlayServices()) {
                   Intent intent = new Intent(LoginActivity.this, GcmRegistrationIntentService.class);
                   startService(intent);
            }
/***// I want to wait here and fetch the GCM token value//***/

            try {
                JSONObject jObj;
                jObj = new JSONObject();

                jObj.put("aes_key", UtilityClass.getencryptkey());
                jObj.put("client_id", key);
                jObj.put("type", "Android");
                // jObj.put("device_token", ); <--- Need to wait for this value


                System.out.println(jObj);
                String authenticateResp = authenticate(jObj);
                System.out.println("Response is: " + authenticateResp);

                JSONObject jResp = new JSONObject(authenticateResp);
                String success = jResp.getString("success");


                if (success.equalsIgnoreCase("True")) {

                    sessionManager.createLoginSession(key);
                    return "granted";

                } else {
                    return jResp.getString("msg");

                }
            } catch (Exception e) {
                e.printStackTrace();
                return "Something went wrong, we are working to fix this, please try again after sometime";
            }
        }

        public String authenticate(JSONObject jObject) {
            return UniversalNetworkConnection.postJSONObject(getResources().getString(R.string.authentication_url), jObject);
        }

所以首先我开始启动意图服务——它有一个注册的本地广播,确定服务已经完成,我在特定活动的 onCreate 中获取处理程序。

 mRegistrationBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d("Login Act", "GCM done");
            }
        };

我想在 doInBackground 中间等待,直到我收到来自我的意图服务的本地广播。这样我就可以将值添加到我的 JSON 对象中。我必须在异步任务中执行此操作,因为我必须使用身份验证成功或错误的相关消息更新 UI。否则我本可以将我所有的逻辑迁移到意图服务——这将是很多夫妻,这不是一个好的设计。

【问题讨论】:

    标签: java android


    【解决方案1】:

    将所有逻辑移至该广播接收器的onReceive。将该接收器声明为活动的内部类,然后您可以在其中操作 UI。

    所以用户点击后的步骤是:

    • 启动 Intent 服务。
    • 完成后发送该服务的广播。
    • onReceive 方法中发送您的 JSON 对象。

    注意:如果您想在后台线程中发送该 JSON,您可以简单地在 onReceive 中定义一个线程并完成工作。

    【讨论】:

    • 我认为这将是最好的解决方案,但这意味着重构大量代码和跟踪 UI 消息将变得乏味。但是我仍然认为我会走这条路
    【解决方案2】:

    您不能在 doInBackground 中执行其他异步任务。这个答案可能会对您有所帮助:https://stackoverflow.com/a/15657500/4676276

    您可以做的是,先启动较小的异步任务,然后等待它完成,然后在第一个任务的onPostExecute 上启动主异步。

    【讨论】:

      【解决方案3】:

      试试这个...

      检查密钥并等待

          @Override
          protected String doInBackground(Void... params) {
      
              if (checkPlayServices()) {
                     Intent intent = new Intent(LoginActivity.this, GcmRegistrationIntentService.class);
                     startService(intent);
              }
              /***// I want to wait here and fetch the GCM token value//***/
      
              while(key==null||key.length()==0){
      
                  try {
                      Thread.sleep(1000);
                  }catch (InterruptedException e) {
                      e.printStackTrace();
                  }
      
             }
      
             try {
                  JSONObject jObj;
                  jObj = new JSONObject();
      
                  jObj.put("aes_key", UtilityClass.getencryptkey());
                  jObj.put("client_id", key);
                  jObj.put("type", "Android");
             /**********************/
      
         }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多