视图模型不断创建实时数据实例

dev*_*v90 5 performance android android-layout android-viewmodel

我在onCreate活动的方法中创建了View Model的实例。

    ticketViewModel = ViewModelProviders.of(this).get(TicketViewModel.class);
Run Code Online (Sandbox Code Playgroud)

然后,我有了方法,AddTicket该方法viewModel用于命中服务,并在响应时viewModel关闭了加载动画。

 public void addTicket(View view){

     ticketViewModel.AddTicket(id).observe(this, response ->{
                        dismissLoadingAnimation();
    } 
Run Code Online (Sandbox Code Playgroud)

现在,添加票证后,用户可以Add Ticket按下按钮,然后addTicket()将再次调用该方法。

但是这次observer在ViewModel中定义的时间被调用了2次,导致2次网络调用和2次dismissLoadingAnimation执行。

如果我一直按下addTicket按钮,则内部ViewModelkeep中定义的执行观察器的数量会增加。

这是我的视图模型代码。

public class TicketViewModel extends AndroidViewModel implements IServiceResponse {

    MutableLiveData<String> mObservableResponse = new MutableLiveData<String>();


    public MutableLiveData AddTicket(String id){

        JsonObject jsonObject= new JsonObject();
        jsonObject.addProperty("id",  id);

        NetworkUtility networkUtility= new NetworkUtility(this, ADD_TICKET);
        networkUtility.hitService(URL, jsonObject, RequestMethods.POST);

        return mObservableResponse;
    }


     @Override
        public void onServiceResponse(String response, String callType){

        if(serviceTag.equalsIgnoreCase(ADD_TICKET)){    
             mObservableResponse.setValue("success");
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

Mik*_*keL 1

你只需要调用observe一次,我更喜欢先调用onResume然后再removeObserver调用onPause

将给定的观察者添加到观察者列表中

您不断向数据添加侦听器,以便获得多个回调。

编辑:
我将我现有的代码示例命名为 aFragment并重命名了所有内容(我希望),这里没有将数据设置为 a 的示例,ViewModel但应该适合ticketViewModel.AddTicket(id);您的情况。

public class ListFragment extends Fragment {

    private MyViewModel viewModel;
    private MyRecyclerViewAdapter recyclerViewAdapter;
    private Observer<List<DatabaseObject>> dataObserver;
    private RecyclerView recyclerView;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_layout, container, false);
        initRecyclerView(rootView, getContext());
        initObservers();

        return rootView;
    }

    private void initRecyclerView(View rootView, Context context) {
        recyclerViewAdapter = new MyRecyclerViewAdapter(context);
        recyclerView = rootView.findViewById(R.id.recycler_view);
        recyclerView.setAdapter(recyclerViewAdapter);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.addItemDecoration(new DividerNoLastItemDecoration());
    }

    private void initObservers() {
        dataObserver = new Observer<List<DatabaseObject>>() {
            @Override
            public void onChanged(@Nullable final List<DatabaseObject> data) {
                recyclerViewAdapter.setData(data);
            }
        };
    }

    @Override
    public void onResume() {
        super.onResume();
        initViewModel();
    }

    private void initViewModel() {
        FragmentActivity activity = getActivity();
        if (activity != null) {
            viewModel = ViewModelProviders.of(activity).get(MyViewModel.class);
            viewModel.getData().observe(activity, dataObserver);
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if (viewModel != null) {
            viewModel.getData().removeObserver(dataObserver);
            viewModel = null;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)