Android 每次重新创建活动时,LiveData observer都会调用

Android 每次重新创建活动时,LiveData observer都会调用,android,mvvm,android-livedata,observers,Android,Mvvm,Android Livedata,Observers,我正在观察一个从外部api获取的livedata。我正在验证livedata并完成活动,如下面的代码所示。但是,当我再次创建此活动时,会再次调用观察者,并且活动会自行完成 viewModel.getRescheduleResponse().observe(this, new Observer<Response >() { @Override public void onChanged(Response response) { i

我正在观察一个从外部api获取的livedata。我正在验证livedata并完成活动,如下面的代码所示。但是,当我再次创建此活动时,会再次调用观察者,并且活动会自行完成

viewModel.getRescheduleResponse().observe(this, new Observer<Response >() {
        @Override
        public void onChanged(Response response) {
            if(response!=null){
                if(response.getOutput().get(0).getStatus().equalsIgnoreCase("success")){
                    Toast.makeText(ProcessDetails.this, "Service rescheduled successfully", Toast.LENGTH_SHORT).show();
                    finish();
                }else{
                    Toast.makeText(ProcessDetails.this, response.getOutput().get(0).getMessage(), Toast.LENGTH_SHORT).show();
                }
            }else{
                Toast.makeText(ProcessDetails.this, "Please check your network", Toast.LENGTH_SHORT).show();
            }


        }
    });
viewModel.getreschedulereresponse().observe(这是新的观察者(){
@凌驾
更改后的公共无效(响应){
if(响应!=null){
if(response.getOutput().get(0.getStatus().equalsIgnoreCase(“成功”)){
Toast.makeText(ProcessDetails.this,“服务重新调度成功”,Toast.LENGTH_SHORT.show();
完成();
}否则{
Toast.makeText(ProcessDetails.this,response.getOutput().get(0).getMessage(),Toast.LENGTH_SHORT).show();
}
}否则{
Toast.makeText(ProcessDetails.this,“请检查您的网络”,Toast.LENGTH_SHORT.show();
}
}
});
这是活动的代码。观察者在重新启动此活动时触发的位置

public class ProcessDetails extends BaseActivity {


TextView tracktech, reschedule;
LinearLayout action;
ProcessDetailViewModel viewModel;
ActivityProcessDetailsBinding binding;
ProgressDialog pdialog;
 Dialog dialog;

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

    binding = DataBindingUtil.setContentView(this, R.layout.activity_process_details);
    //viewModel = new ProcessDetailViewModel();
    viewModel = ViewModelProviders.of(this).get(ProcessDetailViewModel.class);

    if (savedInstanceState == null) {
        viewModel.init();
    }
    pdialog = new ProgressDialog(this);
    pdialog.setMessage("Please wait...");
    binding.setViewModel(viewModel);
    binding.setClickHandlers(new ClickHandlers());


    tracktech = findViewById(R.id.tracktxt);
    reschedule = findViewById(R.id.rescheduletxt);
    action = findViewById(R.id.actionlay);


    if (getIntent().getStringExtra("FROM") != null) {
        tracktech.setVisibility(View.GONE);
        action.setVisibility(View.GONE);

    }


    setupObdservers();


    tracktech.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent i = new Intent(getApplicationContext(), TrackingActivity.class);
            startActivity(i);
        }
    });





}


public void setupObdservers() {


    viewModel.getProcessdetailsResponse().observe(this, new Observer<ProcessDetailResponse>() {
        @Override
        public void onChanged(ProcessDetailResponse processDetailResponse) {
            Log.i("darbar", "okay");

            ProcessDetailModel model = new ProcessDetailModel();

            model.setBrand(processDetailResponse.getOutput().get(0).getBookinglist().get(0).getBrand());
            model.setDate(processDetailResponse.getOutput().get(0).getBookinglist().get(0).getDate());
            model.setTime(processDetailResponse.getOutput().get(0).getBookinglist().get(0).getTime());
            model.setAddress(processDetailResponse.getOutput().get(0).getBookinglist().get(0).getAddress());
            model.setService(processDetailResponse.getOutput().get(0).getBookinglist().get(0).getServiceType());
            model.setTechName(processDetailResponse.getOutput().get(0).getBookinglist().get(0).getTechnicianDetails().get(0).getName());
            model.setTechPhone(processDetailResponse.getOutput().get(0).getBookinglist().get(0).getTechnicianDetails().get(0).getPhoneNo());

            viewModel.setModel(model);
            binding.setViewModel(viewModel);


        }
    });





    viewModel.getRescheduleResponse().observe(this, new Observer<LoginResponse>() {
        @Override
        public void onChanged(LoginResponse loginResponse) {
            if(loginResponse!=null){
                if(loginResponse.getOutput().get(0).getStatus().equalsIgnoreCase("success")){
                    Log.i("darbar","gone");
                    Toast.makeText(ProcessDetails.this, "Service rescheduled successfully", Toast.LENGTH_SHORT).show();

                    finish();
                }else{
                    Toast.makeText(ProcessDetails.this, loginResponse.getOutput().get(0).getMessage(), Toast.LENGTH_SHORT).show();
                }
            }else{
                Toast.makeText(ProcessDetails.this, "Please check your network", Toast.LENGTH_SHORT).show();
            }


        }
    });


}


public class ClickHandlers {


    public void onRescheduleClick(View v) {


        showCustomDialog();


    }


}

private void showCustomDialog() {

     dialog = new Dialog(ProcessDetails.this);
    dialog.setContentView(R.layout.dialog_reschedule);

    Button okbtn = dialog.findViewById(R.id.buttonOk);
    final TextView datetxt = dialog.findViewById(R.id.datetxt);
    final TextView timetxt = dialog.findViewById(R.id.timetxt);


    datetxt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {


            final Calendar calendar = Calendar.getInstance();
            int yy = calendar.get(Calendar.YEAR);
            int mm = calendar.get(Calendar.MONTH);
            int dd = calendar.get(Calendar.DAY_OF_MONTH);
            DatePickerDialog datePicker = new DatePickerDialog(ProcessDetails.this, new DatePickerDialog.OnDateSetListener() {
                @Override
                public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                    String date = String.valueOf(dayOfMonth) + "/" + String.valueOf(monthOfYear+1)
                            + "/" + String.valueOf(year);

                    datetxt.setText(date);
                }
            }, yy, mm, dd);
            datePicker.show();

        }
    });


    timetxt.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {


            Calendar mcurrentTime = Calendar.getInstance();
            int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
            int minute = mcurrentTime.get(Calendar.MINUTE);
            TimePickerDialog mTimePicker;
            mTimePicker = new TimePickerDialog(ProcessDetails.this, new TimePickerDialog.OnTimeSetListener() {
                @Override
                public void onTimeSet(TimePicker timePicker, int hourOfDay, int selectedMinute) {
                    boolean isPM = (hourOfDay >= 12);
                    timetxt.setText(String.format("%02d:%02d %s", (hourOfDay == 12 || hourOfDay == 0) ? 12 : hourOfDay % 12, selectedMinute, isPM ? "PM" : "AM"));

                }
            }, hour, minute, false);//Yes 24 hour time
            mTimePicker.setTitle("Select Time");
            mTimePicker.show();


        }
    });


    okbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            if(datetxt.toString().length()<2){

                Toast.makeText(ProcessDetails.this, "Plese fill reschedule date", Toast.LENGTH_SHORT).show();
            }else if(timetxt.toString().length()<2){

                Toast.makeText(ProcessDetails.this, "Plese fill reschedule time", Toast.LENGTH_SHORT).show();
           } else {
                viewModel.rescheduleService(datetxt.getText().toString(),timetxt.getText().toString());
            }

            // Close dialog
            dialog.dismiss();
        }
    });
    dialog.show();
}
公共类ProcessDetails扩展了BaseActivity{
TextView tracktech,重新安排;
线性布局作用;
ProcessDetailViewModel视图模型;
ActivityProcessDetailsBinding绑定;
ProgressDialog;
对话;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u process\u details);
binding=DataBindingUtil.setContentView(this,R.layout.activity\u process\u details);
//viewModel=新的ProcessDetailViewModel();
viewModel=ViewModelProviders.of(this.get)(ProcessDetailViewModel.class);
如果(savedInstanceState==null){
init();
}
pdialog=新建进度对话框(此对话框);
setMessage(“请稍候…”);
binding.setViewModel(viewModel);
binding.setClickHandlers(新的ClickHandlers());
tracktech=findviewbyd(R.id.tracktxt);
reschedule=findviewbyd(R.id.rescheduletxt);
action=findviewbyd(R.id.actionlay);
if(getIntent().getStringExtra(“FROM”)!=null){
tracktech.setVisibility(View.GONE);
action.setVisibility(View.GONE);
}
setupobdserver();
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
Intent i=新Intent(getApplicationContext(),TrackingActivity.class);
星触觉(i);
}
});
}
public void setupobdserver(){
viewModel.getProcessdetailsResponse().observe(这是一个新的观察者(){
@凌驾
更改后的公共void(ProcessDetailResponse ProcessDetailResponse){
Log.i(“darbar”,“okay”);
ProcessDetailModel模型=新的ProcessDetailModel();
setBrand(processDetailResponse.getOutput().get(0.getBookinglist().get(0.getBrand());
model.setDate(processDetailResponse.getOutput().get(0.getBookinglist().get(0.getDate));
setTime(processDetailResponse.getOutput().get(0.getBookinglist().get(0.getTime));
model.setAddress(processDetailResponse.getOutput().get(0.getBookinglist().get(0.getAddress));
model.setService(processDetailResponse.getOutput().get(0.getBookinglist().get(0.getServiceType());
model.setTechName(processDetailResponse.getOutput().get(0.getBookinglist().get(0.GetTechniciandDetails().get(0.getName));
model.setTechPhone(processDetailResponse.getOutput().get(0.getBookinglist().get(0.GetTechniciandDetails().get(0.getPhoneNo));
viewModel.setModel(model);
binding.setViewModel(viewModel);
}
});
viewModel.getRescheduleResponse().observe(这是新的观察者(){
@凌驾
更改后的公共无效(LoginResponse LoginResponse){
if(loginResponse!=null){
if(loginResponse.getOutput().get(0.getStatus().equalsIgnoreCase(“成功”)){
Log.i(“darbar”、“gone”);
Toast.makeText(ProcessDetails.this,“服务重新调度成功”,Toast.LENGTH_SHORT.show();
完成();
}否则{
Toast.makeText(ProcessDetails.this,loginResponse.getOutput().get(0).getMessage(),Toast.LENGTH_SHORT).show();
}
}否则{
Toast.makeText(ProcessDetails.this,“请检查您的网络”,Toast.LENGTH_SHORT.show();
}
}
});
}
公共类ClickHandler{
公共作废重新计划单击(视图五){
showCustomDialog();
}
}
私有void showCustomDialog(){
dialog=新建对话框(ProcessDetails.this);
setContentView(R.layout.dialog\u重新调度);
按钮okbtn=dialog.findViewById(R.id.buttonOk);
final TextView datetxt=dialog.findviewbyd(R.id.datetxt);
final TextView timetxt=dialog.findviewbyd(R.id.timetxt);
datetxt.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
最终日历=Calendar.getInstance();
int yy=calendar.get(calendar.YEAR);
int mm=calendar.get(calendar.MONTH);
int dd=calendar.get(calendar.DAY/u/u月);
DatePickerDialog datePicker=new DatePickerDialog(ProcessDetails.this,new DatePickerDialog.OnDateSetListener(){
@凌驾
公共void onDateSet(日期选择器视图,整数年,整数月,整数月){
String date=String.valueOf(dayOfMonth)+“/”+String.valueOf(monthOfYear+1)
+“/”+String.valueOf(年);
datetxt.setText(日期);
}
}年月日);
datePicker.show();
}
});
timetxt.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共voi