Получение контекста в потоке, вызываемом службой - PullRequest
2 голосов
/ 06 августа 2011

У меня есть следующий фрагмент кода:

public class DumpLocationLog extends Thread {
    LocationManager lm;
    LocationHelper loc;
    public void onCreate() {
        loc = new LocationHelper();
        lm = (LocationManager) Context.getSystemService(Context.LOCATION_SERVICE);
    }
    public void run() {
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, loc);
    }
}

Я хочу, чтобы он запускался из удаленного сервиса, но в строке lm = (LocationManager) Context.getSystemService(Context.LOCATION_SERVICE); я, конечно, получаю ошибку NullPointerException, потому что context равен нулю.

Как я могу получить контекст здесь? getBaseContext() или getApplicationContext() не работает.

Ответы [ 2 ]

7 голосов
/ 06 августа 2011

A Thread не будет иметь прямого доступа к Context по умолчанию;Вы должны были бы передать его. Потоку также не нужен метод onCreate (который, я думаю, вы вызываете вручную) - я бы просто изменил его на конструктор.Вы можете просто передать Context в конструкторе Thread:

public class DumpLocationLog extends Thread {
    LocationManager lm;
    LocationHelper loc;
    public DumpLocationLog(Context context) {
        loc = new LocationHelper();
        lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    }
    public void run() {
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, loc);
    }
}

Вы можете создать его экземпляр с помощью new DumpLocationLog(this);, если он используется внутри Service (Сервис является подклассом Context, поэтому this работает здесь).Вы запускаете поток, вызывая метод start().

2 голосов
/ 06 августа 2011

Вы можете передать действительный контекст через конструктор или, если ваш класс является внутренним классом внутри службы, вы можете использовать ServiceClassName.this.getContext ()

...