android context nullpointerexception - PullRequest
       1

android context nullpointerexception

3 голосов
/ 15 сентября 2011

У меня есть небольшая проблема с контекстом Android, и я не знаю, как решить проблему. Вот код, который я использую:

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

}

и в этой строке написано исключение Nullpointer:

PackageManager pm = context.getPackageManager();

На самом деле я не могу использовать this.getPackageManager() или TestActivity.getPackageManager() и не могу установить context на this.

Есть предложения?

Ответы [ 5 ]

3 голосов
/ 15 сентября 2011

Если ваш класс - это занятие, лучше использовать это как контекст.Если вам нужен контекст в другом классе, вы можете иметь одноэлементный указатель на свой 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();
3 голосов
/ 15 сентября 2011

@ Roflcoptr указал на основной, но на самом деле ваш класс не расширяет активность, поэтому он не является контекстом, измените его на:

public class TestActivity extends Activity

, если вы хотите, чтобы это было действительное действиеили, если это должен быть только вспомогательный класс, передайте ему действие при его создании.

2 голосов
/ 15 сентября 2011

Вы должны инициализировать свой контекст, добавив конструктор вашего класса, который не является Activity,

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

, а в вашей Activity создайте экземпляр TestActivity, отправив this в качестве параметра, подобногоthis:

TestActivity tActivity = new TestActivity(this);//this refer to the Activity

Второе решение заключается в расширении Activity, и вы должны переопределить метод onCreate()

2 голосов
/ 15 сентября 2011

Проблема в том, что вы объявили контекст, но никогда не создавали его или не присваивали ссылку на него.Поэтому он указывает на ноль.

Обычно вы TestActivity должны быть подклассом класса Activity или чем-то подобным.

В этом случае вы можете сделать что-то вроде

this.getPackageManager();
1 голос
/ 29 марта 2016

вместо создания объекта контекста в классе и сохранения ссылки на действие или приложение приводит к утечкам памяти в Android bcz, вы не создаете какой-либо объект определенного класса.

Вы можете достичь этого, выполнив следующие шаги

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;
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...