Android 每次重新创建活动时,LiveData observer都会调用
我正在观察一个从外部api获取的livedata。我正在验证livedata并完成活动,如下面的代码所示。但是,当我再次创建此活动时,会再次调用观察者,并且活动会自行完成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
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