Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何等待意向服务完成-从AsyncTask启动意向服务时_Java_Android - Fatal编程技术网

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

Java 如何等待意向服务完成-从AsyncTask启动意向服务时,java,android,Java,Android,以下是我的设想: 我有一个登录表单,其中有一个成员密钥字段,一旦用户输入该密钥,我就与服务器通信以进行身份验证。还有两个字段,即key和type,我将它们添加到一个JSON对象中,并将其发送到服务器 现在由于一个请求,我还必须在一次调用中通过GCM令牌发送该登录信息。在“提交”按钮上,单击“我启动以下异步任务” 我的do in Background方法如下所示: @Override protected String doInBackground(Void... params)

以下是我的设想:

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

现在由于一个请求,我还必须在一次调用中通过GCM令牌发送该登录信息。在“提交”按钮上,单击“我启动以下异步任务”

我的do in Background方法如下所示:

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

我想在后台工作,直到我收到我的意向服务的本地广播。这样我就可以将值添加到我的JSON对象中。我必须在异步任务中执行此操作,因为我必须使用验证成功或错误的相关消息更新UI。否则,我就可以将我所有的逻辑迁移到intent服务上——这将是一个非常复杂的设计,而且不是一个好的设计

您不能在doInBackground内执行其他异步任务。这个答案可能会帮助您:


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

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

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

  • 启动该服务
  • 完成后,请在该服务中发送广泛的演员阵容
  • onReceive
    方法发送JSON对象
注意:如果你想在后台线程中发送JSON,你可以简单地在
onReceive
中定义一个线程并完成这项工作。

试试这个

检查钥匙,然后等待

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

   }

我认为这将是最好的解决方案,但这意味着重构大量代码和跟踪UI消息将变得单调乏味。不过,我仍然认为我会这样做
    @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");
       /**********************/

   }