以下是我的情景:
我有一个具有成员密钥字段的登录表单,一旦用户输入此密钥,我就会与服务器进行通信以进行身份验证。还有两个字段,即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。否则我可以将我的所有逻辑迁移到意向服务 - 这将是很多夫妇,这不是一个好的设计。
答案 0 :(得分:2)
将您的所有逻辑移至该广播接收器的onReceive
。将接收器声明为您的活动的内部类,然后您可以在其中操纵UI。
用户点击后的步骤为:
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");
/**********************/
}