如果我没有上下文该怎么办?

时间:2016-05-14 20:49:09

标签: java android sqlite

我正在Android Studio中开发我的第一个应用。我有两节课。一个包含设置。

public class settings {
    private int przed_termin;
    private int przed_po_otwarciu;
    private boolean powiadomienia;
    private ustawienia_sql ustawienia_baza;
}

第二个负责读取并将它们保存到SQLite数据库。现在我尝试在settings_sql中创建对象settings,但要做到这一点,我需要Context。是否有可能超越它?

public class settings_sql extends SQLiteOpenHelper {
    public settings_sql (Context context) {
        super(context, "ustawienia.db", null, 1);
    }
}

4 个答案:

答案 0 :(得分:1)

我会给你一点理解然后代码。对于新的Android程序员来说,上下文是一种常见的挫败感。

实际上有4种不同类型的Context对象。这很重要。通常,如果您正在进行用户控件,则需要托管用户控件的“活动”上下文。日光的答案将适用于此。基本上,上下文对象是一个Activity对象。还有具有服务上下文的Service实例对象。

另一种上下文类型是Application Context。

这是确保应用中的任何类都可以访问应用程序上下文的方法:

创建一个这样的类。这通过访问器静态存储对它自己的引用:

public class MyApp extends Application{
    private static Context applicationContext;

    public void onCreate() {
        applicationContext = this;
    }

    public static Context getApplicationContext() {
        return applicationContext;
    }
}

修改ApplicationManifest.xml以在您的应用程序标记中包含name属性:

<application
    android:name="MyApp"
    android:allowBackup="true"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity......
</application>

然后,只要你需要一个上下文对象,并且没有一个方便使用:

MyApp.getApplicationContext()

例如:

settings_sql(MyApp.getApplicationContext());

因为您在应用程序类中创建了oncreate事件,所以在您的应用程序中,您可以确保它永远不会为null。

答案 1 :(得分:1)

我建议将Context传递给需要它的类。你已经有了settings_sql(Context context)构造函数,这是一个好的开始。

在主应用程序代码中,您可以轻松地从活动或应用程序传递Context,具体取决于您的需求以及settings_sql对象的实际生命周期。此对象是否需要超出单个活动的持续时间?

如果您决定编写测试,那么您可以免于依赖于任意类中保存的静态变量,这可能与您的测试没有多大关系。为什么本地单元测试需要知道Application类,例如?

你可能不会在早期或者根本没遇到这个问题,静态变量可能是一个完全可行的短期解决方案,但要注意这可能会使事情变得尴尬而且很难在你做什么时进行推理在有限的范围内与系统的各个部分进行交互,特别是测试。

答案 2 :(得分:0)

在您的MainActivity中执行以下操作:

private static Context context;

public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }

然后当您拨打电话时,只需传递上下文。

答案 3 :(得分:0)

最简单的解决方案是在APK中添加一个Application类,并为其添加静态方法以检索上下文,如下所示:

public class MyApplication extends Application {
private static MyApplication sInstance = null;

@Override
public void onCreate() {
    super.onCreate();
    sInstance = this;
}

public static Context getContext() {
    return sInstance.getApplicationContext();
}