如果能从更有经验的开发人员那里获得对我的mvvm实现的意见,那将是一个巨大的帮助。我研究android推荐的应用程序架构模式已经有一段时间了。在我确信自己对mvvm应该如何工作有了一个不错的想法之后,我开始更新正在进行的应用程序的代码库,以便更好地遵循mvvm实践。在很大程度上,它的实现非常简单,而且非常容易(多亏了google和你们在stackoverflow上的帮助)。然而,一直困扰我的是如何正确处理事件和导航。
是的,我知道,这个网站上有很多答案可以回答这个问题。唯一的问题是,几乎每一个问题的答案都不尽相同,而且似乎都比实际情况复杂一些。不管怎样,我不是在寻找这些问题的答案。
相反,我希望我能得到一个更有经验的开发人员的意见,看看我的这一小部分代码是否符合mvvm的要求。我之所以提出处理事件和导航,是因为下面的代码处理了非常简化的导航和事件处理(只需在单击按钮后结束活动的生命周期)。我认为我遵循了mvvm实践,但我不是100%肯定,而且没有官方文档指定如何做这样的事情,至少我没有见过。
不管怎样,我会在下面粘贴相关的代码,我会尽我所能省略任何现在不在审查范围内的内容。
创建活动
***注意,在 onCreate
以及 onOptionsItemSelected
方法
public class CreateActivity extends AppCompatActivity {
private static final String TAG = "CreateActivity";
private EditText searchNameEditText;
private Spinner modelSpinner;
private EditText yearEditText;
private EditText trimEditText;
RangeSlider priceSlider;
private CreateViewModel createViewModel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create);
instantiateUI();
createViewModel = new ViewModelProvider(this).get(CreateViewModel.class);
// Observes a MutableLiveData and kills the activity when the data is updated (the value of the
// data doesn't matter)
createViewModel.getCreateCancelled().observe(this, isCancelled -> finish());
// Observes a MutableLiveData and uses Toast to show the String value when it is updated
createViewModel.getToastMessage().observe(this, message ->
Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show());
}
public void createNewSearch() {
String searchName = searchNameEditText.getText().toString();
String model = modelSpinner.getSelectedItem().toString();
String trim = trimEditText.getText().toString();
String year = yearEditText.getText().toString();
List<Float> priceValues = priceSlider.getValues();
String minPrice = Collections.min(priceValues).toString();
String maxPrice = Collections.max(priceValues).toString();
// Calls method in ViewModel to create new "search" then kills the activity
createViewModel.create(searchName, model, trim, year, minPrice, maxPrice);
finish();
}
private void instantiateUI() {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
searchNameEditText = findViewById(R.id.et_search_name);
modelSpinner = findViewById(R.id.spinner_model);
trimEditText = findViewById(R.id.et_trim);
yearEditText = findViewById(R.id.et_year);
priceSlider = findViewById(R.id.slider_price);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
R.array.models__array, R.layout.create_list_item);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
modelSpinner.setAdapter(adapter);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Calls a method in ViewModel to handle event
createViewModel.handleOnOptionsItemSelected(item.getItemId());
return super.onOptionsItemSelected(item);
}
}
创建视图模型
public class CreateViewModel extends AndroidViewModel {
private static final String TAG = "CreateViewModel";
private SearchRepository repository;
private MutableLiveData<String> toastMessage;
private MutableLiveData<Boolean> createCancelled;
public CreateViewModel(Application application) {
super(application);
repository = new SearchRepository();
toastMessage = new MutableLiveData<>();
createCancelled = new MutableLiveData<>();
}
public void create(String name, String model, String trim, String year, String minPrice, String maxPrice) {
repository.create(name, model, trim, year, minPrice, maxPrice);
}
public MutableLiveData<String> getToastMessage() {
return toastMessage;
}
// Updating the value in toastMessage will trigger a Toast message in the view
public void setToastMessage(String message) {
toastMessage.postValue(message);
}
public MutableLiveData<Boolean> getCreateCancelled() {
return createCancelled;
}
// Called when MenuItem is clicked and triggers the view to kill the activity
public void handleOnOptionsItemSelected(int itemId) {
if (itemId == android.R.id.home)
createCancelled.postValue(true);
}
}
搜索存储库
public class SearchRepository {
private static final String TAG = "SearchRepository";
private static final FirebaseAuth AUTH_REF = FirebaseAuth.getInstance();
private static final DatabaseReference DATABASE_REF = FirebaseDatabase.getInstance().getReference();
public SearchRepository() {
}
// Called from the CreateViewModel -- creates a new "search"
public void create(String name, String model, String trim, String year, String minPrice, String maxPrice) {
//TODO-- Add completed check and return boolean to confirm success
final String KEY = DATABASE_REF.child("queries").child(AUTH_REF.getCurrentUser().getUid()).push().getKey();
SearchModel searchModel = new SearchModel(KEY, name, model, trim, year, minPrice, maxPrice);
// The WebScraper class saves the new "search" and its results to the Firebase Database
WebScraper scraper = new WebScraper(searchModel, DATABASE_REF, AUTH_REF.getCurrentUser().getUid());
scraper.execute();
}
}
暂无答案!
目前还没有任何答案,快来回答吧!