Java Android изменяет переменные-члены из потока обратного вызова - PullRequest
0 голосов
/ 20 сентября 2018

По сути, я пытаюсь получить какое-то значение из ответа обратного вызова Api, а затем присвоить это значение некоторым из моих переменных-членов, но кажется, что программа должна каждый раз запускать мой метод getPatientRecord (), прежде чем он сможетна мой вызов, с которым я никогда не сталкивался раньше.

Результат вывода журнала: viewPatient: метод paitient viewPatient: secondHello worldnullnull 100SN9 - David Hello HMH 1971-08-09

Это мой код:

public class ViewPatientRecord extends AppCompatActivity{
TextView tvName, tvGender, tvBirthDate, tvAddress;
String pGender, pAddress, pBirthdate;
String pName = "Hello world";
Patient myPatient;

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

    tvName = findViewById(R.id.tvFullName);
    tvGender = findViewById(R.id.tvGender);
    tvBirthDate = findViewById(R.id.tvDb);
    tvAddress = findViewById(R.id.tvAddress);

    myPatient= new Patient();
    try {
        getPatientRecord();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}


private void getPatientRecord() throws InterruptedException {
    SharedPreferences myPre = getSharedPreferences("PatientRecord", MODE_PRIVATE);
    if(myPre.getString("uuid",null)!=null){
        retrievePatientByUuid(myPre.getString("uuid",null));
        Log.d("viewPatient", "second"+pName+pGender+pBirthdate);
        tvName.setText(pName);
        tvGender.setText(pGender);
        tvBirthDate.setText(pBirthdate);
        tvAddress.setText(pAddress);
    }else{
        Toast.makeText(ViewPatientRecord.this, "Something went wrong, please contact the administrator for help!", Toast.LENGTH_SHORT).show();
    }
}

private void retrievePatientByUuid(String uuid) throws InterruptedException {
    RestApi api = RetrofitInstance.getRetrofitInstance().create(RestApi.class);
    Log.d("viewPatient", "paitient method");

    Call<Patient> call = api.getPatientByUUID(uuid, null);
    call.enqueue(new Callback<Patient>() {
        private volatile Patient obj = new Patient();
        @Override
        public void onResponse(Call<Patient> call, Response<Patient> response) {
            if (response.body() != null) {
                Patient patient = response.body();
                if (patient != null) {
                    if (!patient.getDisplay().isEmpty()) {
                        pName = patient.getDisplay();
                        pGender = patient.getPerson().getGender();
                        pBirthdate = patient.getPerson().getBirthdate();
                        Log.d("viewPatient", pName.toString() + " H " + pGender.toString() + " H " + pBirthdate.toString() + " ?? ");
                        pAddress = "";
                    } else {
                            Log.d("viewPatient", "no results");
                        }
                } else {
                    Toast.makeText(ViewPatientRecord.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
                }
            } else {
                Toast.makeText(ViewPatientRecord.this, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show();
            }
        }
        @Override
        public void onFailure(Call<Patient> call, Throwable t) {
            t.printStackTrace();
        }
    });
}
}

1 Ответ

0 голосов
/ 20 сентября 2018

Я не вижу проблемы.Вызов выполняется в retrievePatientByUuid, который вызывается getPatientRecord.Так что да, вы должны пройти через getPatientRecord.Вызов асинхронный.Именно в обратном вызове вы должны установить свои TextViews:

    tvName.setText(pName);
    tvGender.setText(pGender);
    tvBirthDate.setText(pBirthdate);
    tvAddress.setText(pAddress);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...