Android上下文空指针异常

3

我在使用android Context时遇到了一些问题,不知道该怎么解决。这是我正在使用的代码:

public class TestActivity {
Context context;
public static  String getPackageVersion(){  
        try {
            PackageManager pm = context.getPackageManager();
            PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
            version = packageInfo.versionName;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return version;
    }

    public static boolean checkClientApiVer(String clientApiVer){

        int s = RPCCommunicator.strVerToIntVer(clientApiVer);
        int c = RPCCommunicator.strVerToIntVer(getPackageVersion());

        return (c>=s);
    }

     public boolean execute() {

        serverApiVer = jsonObj.getString("server_api_ver");
        Log.w("SERVER API VER","SHOW SERVER API VERSION : "+serverApiVer);

            checkClientApiVer(serverApiVer);
}

它显示在这一行中出现了空指针异常:

PackageManager pm = context.getPackageManager();

实际上我不能使用this.getPackageManager()或者TestActivity.getPackageManager(),同时我也不能将context设置为this

有什么建议吗?


你解决了吗?我也遇到了同样的问题。(回答出奇地没用) - Alexander Malakhov
5个回答

3
@Roflcoptr指出了基础知识,但实际上,你的类并没有扩展Activity,因此它不是一个上下文,请将其更改为:
public class TestActivity extends Activity

如果你希望它成为一个真正的Activity,或者仅作为一个辅助类,那么在实例化时要将其传入Activity。


实际上,我忘了提及并添加我的TestActivity已经扩展了一个自定义类。它只是一个辅助类,而不是一个Activity。 - Android-Droid
如果您的类不是Activity,则应该在构造函数中将上下文传递给您的类,就像我在答案中描述的那样。 - Houcine
实际上,这仍然没有帮助。 - Android-Droid

3

如果您的类是一个活动(Activity),最好将其用作上下文。如果您需要在另一个类中使用上下文,您可以在应用程序上下文(applicationContext)上具有单例指针。

public class MyApp extends Application {

    private static MyApp instance;

    public MyApp() {
        instance = this;
    }

    public static Context getContext() {
        return instance;
    }
}

同时还需要在您的清单文件中:

<application
    android:name="com.mycompany.appname.MyApp"
    android:icon="@drawable/icon"
    android:label="@string/app_name">

现在,您可以始终通过此方式获取上下文。
MyApp.GetContext();

2
问题在于你声明了context,但从未实例化或分配引用。因此它指向null。
通常,TestActivity应该是Activity类或类似类的子类。
在这种情况下,你可以做以下操作:
this.getPackageManager();

2

您需要通过添加一个非Activity类的构造函数来初始化上下文,

public TestActivity(Context c) {
   this.context = c;
}

在您的Activity中,通过将this作为参数发送来实例化TestActivity,如下所示:
TestActivity tActivity = new TestActivity(this);//this refer to the Activity

第二种解决方案是扩展一个Activity,并且您应该覆盖方法onCreate()

1

在Android中,如果您在类中创建上下文对象并保留活动或应用程序的引用,则会导致内存泄漏,因为您没有创建特定类的任何对象。

您可以通过以下步骤实现:

1> 创建应用程序上下文的单例类,并在manifest.xml中定义应用程序类;这样整个应用程序生命周期中将只有一个上下文对象

2> 在使用该方法时传递上下文。

public static  String getPackageVersion(Context context){  
    try {
        PackageManager pm = context.getPackageManager();
        PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);
        version = packageInfo.versionName;
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    }
    return version;
}  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接