1

내 앱에서는 각기 독자적으로 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); 
    } 
} 
+1

다른 접근법은 AppCompatActivity를 확장하고 모든 도우미 메서드를 포함하는'BaseActivity' 클래스를 만드는 것입니다. 모든 활동은 'BaseActivity'를 확장해야합니다. 이 경우 헬퍼 메소드는 정적이 아니며'this'를'Context'로 사용할 수 있기 때문에 모든 헬퍼 메소드에 'Context'를 전달할 필요가 없습니다. –

+1

그리고 왜'static' 메소드에서'AtomicReference'를 사용해야하는지 전혀 알 수 없습니다. –

+1

고마워요, @ DavidWasser. 헬퍼 파일을 당신이 제안한대로'BaseActivity' 파일로 재구성했습니다. 이것은 훨씬 깔끔하고 관리하기 쉽습니다. 나는 아직도 안드로이드 스튜디오가'AtomicReference'를 제안한 이유에 대해서는 확신하지 못했다. – aterbo

답변

1

당신의 static 방법.

또 다른 방법은 AppCompatActivity까지 확장되는 BaseActivity 클래스를 만들고 모든 도우미 메서드를 포함하는 것입니다. 모든 활동은 BaseActivity으로 연장됩니다. 이 경우 헬퍼 메서드는 정적이 아니며 thisContext으로 사용할 수 있으므로 Context을 이러한 모든 도우미 메서드에 전달할 필요가 없습니다.