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