将Context传递给非活动类的最佳实践?

时间:2011-10-24 19:13:32

标签: android android-activity android-context

所以,我的第一个主要应用程序几乎已编码,我正在对我的代码进行优化。该应用程序工作正常,但我不确定我将上下文传递给其他类的方式。我不想以错误的方式去做。我在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);
    }
}

这样好吗?如果有人可以提供一个易于阅读的文章,并提供有关此主题的示例,那就太好了。

4 个答案:

答案 0 :(得分:37)

您可以使用ContextWrapperas described here.

执行此操作

例如:

public class MyContextWrapper extends ContextWrapper {

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

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

从活动

中调用非活动类
new MyContextWrapper(this);

答案 1 :(得分:1)

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

public void iNeedContext(Context context) {...

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

Context mContext = MainActivity.this;
Activity mActivity = MainActivity.this;

答案 2 :(得分:0)

我已经通过这样的上下文解决了我的问题:

    public class Utils extends ContextWrapper {
private final Context context;
    
    public Utils(Context context) {
        super(context);
        this.context = context;
    }
public void mymethod(){}
}

super(context);ContextWrapper 有助于使 getBaseContext()getApplicationContext() 有效并且 this.context = context; 在变量中捕获上下文,我可以在方法中需要的任何地方使用。 也许您可以选择使用带有 this.context = context; 的构造函数并替换所有出现的 getApplicationContext()getBaseContext()。 好吧,如果只使用类中的少量上下文以避免内存泄漏,则更好的方法是将上下文直接传递给方法。

答案 3 :(得分:-3)

您还可以为MainActivity方法中初始化的onCreate()创建静态实例引用

public class MainActivity extends AppCompatActivity {

    public static MainActivity mMainActivity;

    @Override
    private onCreate(Bundle savedInstanceState){

    //...

    mMainActivity = this;

    }
}

并调用上下文:

MainActivity.mMainActivity;

或者如果方法getInstanceOf()更清晰和/或您更喜欢使用访问者,请编写方法

MainActivity.getInstanceOf();

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

MainActivity.mMainActivity.myInstanceMethod();

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