1

在我的應用程序中,我瀏覽了大約5個不同的屏幕,每個屏幕都在它自己的activity中。幾乎任何activity都可以從任何其他activity調用,所以我試圖建立一個幫助文件來管理intents,以便我沒有冗餘代碼。幫助文件中的intents和活動導航的AtomicReferences

我使用public static方法構建了一個幫助程序文件,並在調用這些方法時傳遞活動context和任何所需的數據。這似乎在我的設備(Samsung Galaxy S5)上正常工作,但Android Studio建議在我的幫助程序文件中製作我的意圖AtomicReference。

你能幫我理解,爲什麼這些應該是AtomicReference<Intent>

此外,將context傳遞給助手文件以進行這些調用是否合適?

ActivityHelper文件:

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); 
     } 
    }); 
} 
} 

從菜單中AppCompatActivity呼籲幫助文件的例子:

@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

另一種方法是創建一個'BaseActivity'類來擴展AppCompatActivity幷包含所有的幫助器方法。所有的活動都應該擴展'BaseActivity'。在這種情況下,您不需要將'Context'傳遞給所有這些輔助方法,因爲輔助方法將是非靜態的,並且可以將'this'用作'Context'。 –

+1

我完全看不出任何理由,爲什麼您需要在任何'static'方法中使用'AtomicReference'。 –

+1

謝謝@DavidWasser。按照您的建議,我將我的幫助文件重建爲「BaseActivity」。這是更清潔,更容易管理。我仍然不確定Android Studio爲什麼會提示'AtomicReference',但它無論如何都能正常工作。 – aterbo

回答

1

我看不到任何理由的,爲什麼你會需要在任何使用一個AtomicReferencestatic方法。

另一種方法是創建一個BaseActivity類,它擴展AppCompatActivity,包括所有的輔助方法。所有的活動都應該延伸到BaseActivity。在這種情況下,您不需要將Context傳遞給所有這些輔助方法,因爲輔助方法將是非靜態的,並且可以使用this作爲Context