如何等待意向服务完成 - 从AsyncTask启动意图服务时

时间:2015-09-18 09:21:16

标签: java android

以下是我的情景:

我有一个具有成员密钥字段的登录表单,一旦用户输入此密钥,我就会与服务器进行通信以进行身份​​验证。还有两个字段,即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。否则我可以将我的所有逻辑迁移到意向服务 - 这将是很多夫妇,这不是一个好的设计。

3 个答案:

答案 0 :(得分:2)

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

用户点击后的步骤为:

  • 启动Intent Service。
  • 完成后,在该服务中发送广泛的演员。
  • onReceive方法发送您的JSON对象。

注意:如果您想在后台线程中发送该JSON,您只需在onReceive内定义一个线程即可完成工作。

答案 1 :(得分:0)

你不能在doInBackground中做另一个异步任务。这个答案可能会对您有所帮助:https://stackoverflow.com/a/15657500/4676276

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

答案 2 :(得分:0)

试试这个......

检查密钥并等待

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

   }