我正在尝试使用翻新实现同步呼叫。我想等待回应。我有一个片段,如Loginfrag
public class LoginFrag extends Fragment implements View.OnClickListener {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.login_button:
AuthClient auth = new AuthClient();
try {
auth.getLogin(email, password);
responseCode = auth.getResponseCode();
if (responseCode.equals("1")){
startActivity(new Intent(getActivity(), TFActivity.class));
}
else{
Toast.makeText(getActivity(), "error")
}
catch(Exception e){
e.PrintStackTrace();
}
}
我总是将responseCode设置为Null。并且在if(responseCode.equals(“ 1”))行上抛出空指针异常
在我的AuthClient类中,我有这段代码
class AuthClient{
public void getLogin(String email, String password) throws Exception {
// constructing header and body
RetroRequest(headMap, bodyMap);
}
private void RetroRequest(HashMap headMap, HashMap bodyMap) {
MessageReceiver receiver = new MessageReceiver(new Message());
Intent intent = new Intent(appContext, BackgroundService.class);
intent.putExtra("headMap", headMap);
intent.putExtra("bodyMap", bodyMap);
intent.putExtra("receiver", receiver);
appContext.startService(intent);
Log.i(TAG, "RetroRequest: "+ getResponseCode()); // here it logs null
}
public class Message {
public void displayMessage(int resultCode, Bundle resultData) {
String message = resultData.getString("message");
oResponseCode = message;
setoResponseCode(message);
// here it logs displayMessage: 1 resp 1
Log.i(TAG, "displayMessage: " + message + " resp" + oResponseCode);
}
}
在我的后台服务类中
public class BackgroundService extends IntentService {
public BackgroundService() {
super("Background Service");
}
@Override
public void onCreate(){
super.onCreate();
Log.i("Background Service", "onCreate: Created Background Service");
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
ResultReceiver receiver = intent.getParcelableExtra("receiver");
String url2 = "http://whateverzzzzz.com";
Bundle extras = intent.getExtras();
HashMap headMap = (HashMap) extras.getSerializable("headMap");;
HashMap bodyMap= (HashMap) extras.getSerializable("bodyMap");
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(loggingInterceptor).build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url2)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
RequestCall requestCall = retrofit.create(RequestCall.class);
Call<JsonObject> call = requestCall.getJSON(headMap, bodyMap);
try {
Response<JsonObject> response = call.execute();
JsonObject posts = response.body();
Log.i("success ", "onResponse: " + posts.toString());
JsonParser parser = new JsonParser();
JsonObject rootObj = parser.parse(posts.toString()).getAsJsonObject();
JsonObject responseDetails = rootObj
.getAsJsonObject("resp")
.getAsJsonObject("respDetails");
String oResponseCode = responseDetails.get("responseCode").getAsString();
Bundle bundle = new Bundle();
bundle.putString("message", oResponseCode);
receiver.send(1234, bundle);
//here it logs correct response message
Log.i("success3 ", "onResponse: " + responseDetails.toString());
} catch (IOException e) {
}
}
}
考虑到有时需要同步请求,我从Volley转到了翻新。我正在尝试在后台Service上执行并将数据返回到fragment.I还有另一个消息接收器类,它确实将数据发送回,但是LoginFrag中的代码继续执行。谢谢您的帮助。