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)
你只需要调用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)
| 归档时间: |
|
| 查看次数: |
399 次 |
| 最近记录: |