代码之家  ›  专栏  ›  技术社区  ›  User3

如何等待intent服务完成-当intent服务从AsyncTask启动时

  •  0
  • User3  · 技术社区  · 9 年前

    以下是我的设想:

    我有一个登录表单,其中有一个成员密钥字段,一旦用户输入该密钥,我就与服务器通信以进行身份验证。还有两个字段,即key和type。我将它们添加到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);
            }
    

    因此,首先我开始启动intent服务,它有一个注册的本地广播,确定服务已经完成,然后在特定活动的onCreate中获取处理程序。

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

    我想在doInBackground的中间等待,直到我收到来自我的意图服务的本地广播。这样我就可以将值添加到JSON对象中。我有必要在异步任务中这样做,因为我必须用认证成功或失败的相关消息更新UI。否则,我可以将所有逻辑迁移到intent服务中,这将是一对夫妇,这不是一个好的设计。

    3 回复  |  直到 9 年前
        1
  •  2
  •   frogatto    9 年前

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

    因此,用户单击后的步骤如下:

    • 启动该意向服务。
    • 当你完成这项服务时,请派出一名广泛的演员。
    • 将JSON对象发送到 接收时 方法

    注: 如果您想在后台线程中发送JSON,只需在内部定义一个线程 接收时 并完成工作。

        2
  •  0
  •   Community kfsone    7 年前

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

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

        3
  •  0
  •   uday    9 年前

    试试这个。。。

    检查钥匙并等待

        @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");
           /**********************/
    
       }