2011-10-24 66 views
47

所以,我的第一个主要应用程序几乎编码,我正在对我的代码进行优化。该应用程序工作正常,但我不确定我的方式将上下文传递给其他类。我不想这样做。我偶然发现了有关上下文的Stackoverflow中的文章和问题,以及将它传递给非活动类的正确方法。我也阅读了文档,但作为一个芬兰人使复杂的技术说话更难以理解。将上下文传递给非活动类的最佳实践?

所以,一个简单的问题。我将主要活动的上下文传递给其他(辅助)类的方式是否正确?如果没有,我可以在哪里阅读更多有关这些情况的更好实践。

例如: MainActivity.java

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle sis){ 
     super(sis); 
     new Helper(MyActivity.this).makeMyAppAwesome(); 
    } 
} 

Helper.java

public class Helper { 
    Context context; 
    Helper(Context ctx){ 
     this.context = ctx; 
    } 

    public void makeMyAppAwesome(){ 
     makeBaconAndEggsWithMeltedCheese(context); 
    } 
} 

这样行吗?如果有人能够提供一个容易阅读的文章并带有关于这个主题的例子,这将是很好的。

+3

拇指的基本规则是不抱到了'Context'长于'Context'存在。 –

+0

这是我不确定我理解的一种说法。很明显,我不在另一个Activity中使用相同的上下文,但是这可能不是您所说的内容? –

+3

对于这个例子来说,关键在于理解Activity的生命周期。这将防止内存泄漏并使用Activity的旧实例(在您的示例中不会发生这种情况)。在你的帮手中,我将包括一种方法来在onStop中设置activity null并在onStart中再次设置该值。 –

回答

33

你可以做,使用ContextWrapperas described here.

例如:

public class MyContextWrapper extends ContextWrapper { 

    public MyContextWrapper(Context base) { 
     super(base); 
    } 

    public void makeMyAppAwesome(){ 
     makeBaconAndEggsWithMeltedCheese(this); 
    } 
} 

,并调用非活性类这样从活动

new MyContextWrapper(this); 
+1

欢迎来到SO,真的提供了比现有更好的答案,并在第一篇文章的热门问题上被接受!我已经编辑过你的答案,只是为了正确地设置代码格式 - 请在下次回答时查看帮助链接获取更多信息。 :) – OJFord

+2

如果我的课程已经扩展了其他一些课程,就不能使用它。 –

+0

这与保留上下文一样糟糕。请注意,ContextWrapper将保持对上下文的引用。如果你使用这个,那么确保你创建的ContextWrapper被正确解除引用。 –

-3

你也可以创建一个静态实例引用您的MainActivityonCreate()方法中初始化

public class MainActivity extends AppCompatActivity { 

    public static MainActivity mMainActivity; 

    @Override 
    private onCreate(Bundle savedInstanceState){ 

    //... 

    mMainActivity = this; 

    } 
} 

,并调用这样的背景下:

MainActivity.mMainActivity; 

或写一个方法getInstanceOf()如果它更清晰和/或你喜欢使用访问

MainActivity.getInstanceOf(); 

这一策略可能会为您提供如果稍后决定要调用主要活动中包含的实例方法,则可以采用一些灵活性:

MainActivity.mMainActivity.myInstanceMethod(); 

只是一个建议。批评是受欢迎和鼓励的。

+0

public static MainActivity mMainActivity;这将创建一个Activity的全局静态实例,不会被垃圾收集,因此会泄漏内存。 –

1

通常在您需要的时候传递当前上下文通常符合您的最佳利益。将它存储在一个成员变量中可能会导致内存泄露,并且在您的应用程序中构建更多活动和服务时开始引发问题。

public void iNeedContext(Context context) {... 

此外,在具有上下文的任何类,我建议制备一个成员变量是为了可读性和可搜索的,而不是直接传递或(ClassName.)this。例如,在MainActivity.java

Context mContext = MainActivity.this; 
Activity mActivity = MainActivity.this; 
相关问题