Retrofit 2.0同步请求失败

时间:2019-10-30 02:15:42

标签: android retrofit2 synchronous

我正在尝试使用翻新实现同步呼叫。我想等待回应。我有一个片段,如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中的代码继续执行。谢谢您的帮助。

0 个答案:

没有答案