내 앱에서는 각기 독자적으로 activity
인 약 5 개의 서로 다른 화면 사이를 탐색합니다. 꽤 많이 어떤 activity
도 다른 activity
에서 호출 할 수 있으므로 중복 코드가 없도록 intents
을 관리하는 도우미 파일을 작성하려고합니다.헬퍼 파일의 의도 및 활동 내비게이션에 대한 원자 참조
public static
메서드로 도우미 파일을 만들고이 메서드를 호출 할 때 context
활동과 모든 필수 데이터를 전달합니다. 이것은 내 장치 (Samsung Galaxy S5)에서 정상적으로 작동하는 것으로 보입니다.하지만 Android Studio에서는 내도 움말 파일에서 AtomicReference를 사용하도록 권장합니다.
이들이 AtomicReference<Intent>
이어야하고 이유가 무엇인지 이해할 수 있습니까?
또한 이러한 호출을 수행하기 위해 context
을 도우미 파일로 전달하는 것이 적절합니까?
ActivityHelper 파일 : AppCompatActivity의 메뉴에서 전화 도우미 파일의
public class ActivityHelper {
private ActivityHelper() {}
public static void startAddNewMealActivity(Context context) {
Intent newMealIntent = new Intent(context, MealEditActivity.class);
context.startActivity(newMealIntent);
}
public static void startMealListActivity(Context context) {
Intent intent = new Intent(context, MealListActivity.class);
context.startActivity(intent);
}
public static void startEditMealActivity(Context context, FBMeal meal, String mealFBKey) {
Intent intent = new Intent(context, MealEditActivity.class);
intent.putExtra(Constants.INTENT_FB_KEY_EXTRA_TAG, mealFBKey);
intent.putExtra(Constants.INTENT_MEAL_EXTRA_TAG, meal);
context.startActivity(intent);
}
public static void startEditLastMealActivity(final Context context) {
FBHelper.getQueryForMostRecentMeal().addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (FBHelper.isExistingDataSnapshop(dataSnapshot)) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
FBMeal selectedMeal = snapshot.getValue(FBMeal.class);
String selectedMealId = snapshot.getKey();
startEditMealActivity(context, selectedMeal, selectedMealId);
}
} else {
Utils.showToastFromStringResource(R.string.no_meals, context);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Utils.showToastFromStringResource(R.string.error_getting_meal, context);
}
});
}
}
예 : 어떤에서 AtomicReference
를 사용해야하는 이유를 나는 전혀 이유를 볼 수 없습니다
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.edit_meal_menu:
ActivityHelper.startEditMealActivity(this, meal, mealFBKey);
return true;
case R.id.edit_last_entry_menu:
ActivityHelper.startEditLastMealActivity(this);
return true;
case R.id.about_menu:
DialogFragment newFragment = AboutDialog.newInstance();
newFragment.show(getFragmentManager(), "about");
default:
return super.onOptionsItemSelected(item);
}
}
다른 접근법은 AppCompatActivity를 확장하고 모든 도우미 메서드를 포함하는'BaseActivity' 클래스를 만드는 것입니다. 모든 활동은 'BaseActivity'를 확장해야합니다. 이 경우 헬퍼 메소드는 정적이 아니며'this'를'Context'로 사용할 수 있기 때문에 모든 헬퍼 메소드에 'Context'를 전달할 필요가 없습니다. –
그리고 왜'static' 메소드에서'AtomicReference'를 사용해야하는지 전혀 알 수 없습니다. –
고마워요, @ DavidWasser. 헬퍼 파일을 당신이 제안한대로'BaseActivity' 파일로 재구성했습니다. 이것은 훨씬 깔끔하고 관리하기 쉽습니다. 나는 아직도 안드로이드 스튜디오가'AtomicReference'를 제안한 이유에 대해서는 확신하지 못했다. – aterbo