【发布时间】: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。否则我本可以将我所有的逻辑迁移到意图服务——这将是很多夫妻,这不是一个好的设计。
【问题讨论】: