2 years ago

#75432

test-img

SHwan

response.body() result changes during execution. (retrofit2-get method)

I'm a beginner learning Android. I'm trying to make my application receive data from local database. So I used retroit2 as followed

public class SNSDataServicer {
    private String BASE_URL = "http://10.0.2.2:8080/";

    Retrofit retrofitClient =
            new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();

    SelectAPI select = retrofitClient.create(SelectAPI.class);
    InsertAPI insert = retrofitClient.create(InsertAPI.class);
    UpdateAPI update = retrofitClient.create(UpdateAPI.class);
    DeleteAPI delete = retrofitClient.create(DeleteAPI.class);
}

interface SelectAPI{
    @GET("sns/all/{candidate}")
    Call<List<SNSData>> selectAllByCandidate(@Path("candidate") String candidate);
}

and this is the code for MainActivity.java

public class MainActivity extends AppCompatActivity {

    SNSDataServicer dataService = new SNSDataServicer();
    List<SNSData> snsDataList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView checker = findViewById(R.id.checker);
        Button button = findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dataService.select.selectAllByCandidate("3").enqueue(new Callback<List<SNSData>>() {
                    @Override
                    public void onResponse(Call<List<SNSData>> call, Response<List<SNSData>> response) {
                        snsDataList = response.body();
                        return;
                    }
                    @Override
                    public void onFailure(Call<List<SNSData>> call, Throwable t) {
                        t.printStackTrace();
                        Toast.makeText(getApplicationContext(), "Fail", Toast.LENGTH_LONG).show();
                        Log.d("Failure", "onResponse: Failed");
                    }
                });

                if(snsDataList==null) {
                    checker.setText("null");
                } else {
                    checker.setText(snsDataList.get(0).getMedia());
                }
            }
        });
    }
}

When I press button, the textview's text should be set to size of the list. But snsDataList kept on returning null eventhough reponse.body() returned list successfully

below is scree capture of my debugging.

1. enter image description here

by this point it was perfect, but when I hit F8 to debug next step

  1. enter image description here

response body has been changed and when I hit F8 more, it takes me to

ExecutorCallAdapterFactory.java
Handler.class
Looper.class

and no more.

Then suddenly my snsDataList becomes null...

This is ridiculously hard for me and I've tried to solve it by myself for very long but I have failed... Can someone help me with this problem? It will be really grateful.

android

retrofit

0 Answers

Your Answer

Accepted video resources