Попытка вызвать виртуальный метод '... distanceTo' для нулевой ссылки на объект - PullRequest
0 голосов
/ 11 июня 2018

Я посмотрел везде, где возможно, и нашел нада.Уже несколько часов я пытаюсь решить эту проблему, но не повезло.У меня есть функция, которая предназначена для получения моего местоположения один раз через requestLocationUpdates и затем getLastKnownLocation .Теперь вот вещь.Если службы определения местоположения на телефоне отключены, появляется всплывающее окно alertDialog, спрашивающее, хочет ли пользователь активировать его и, если он это делает, переводит его в окно настроек.В случае, если сервисы отключены, и пользователь заходит в окно настроек, активирует их и затем повторяет попытку использования функции, что-то странное происходит.Позже я использую местоположение, которое я отчаянно пытаюсь найти здесь, в следующем упражнении, но это ссылка на нуль, поэтому он вылетает.Если я обычно запускаю приложение, оно вылетает со следующей ошибкой:

Причина: java.lang.NullPointerException: Попытка вызвать виртуальный метод 'float android.location.Location.distanceTo (android.location.Location) 'для ссылки на пустой объект

Если я отлаживаю приложение, оно работает просто отлично.И если я запускаю таймер сна 3000 миллисекунд между requestLocationUpdates и getLastKnownLocation, он иногда работает, а иногда нет.Я ЛЮБЛЮ немного помощи, потому что я просто невежественен.

Я использую AsyncTask, потому что я думал, что это происходит, потому что устройству не удается завершить requestLocationUpdates (), прежде чем оно достигнет getLastKnownLocation (), поэтому я использовал AsyncTaskи .get () так, что он ждет, пока не закончится.

Ниже приведены коды.

Получатель местоположения

ArrayList<ArrayList<String>> teachers = Client.getTeachers();
Location loc;
loc = gpsOps.getLocation();
Intent i = new Intent(getApplicationContext(), teachersScreen.class);
i.putExtra("teachers", teachers);
i.putExtra("location", loc);
startActivity(i);

gpsOps.getLocation

public static Location getLocation()
{
    try {
        new AsyncGetLocation().execute().get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    List<String> providers = lm.getProviders(true);
    Location l = null;

    for (int i = providers.size() - 1; i >= 0; i--) {
        l = lm.getLastKnownLocation(providers.get(i));
        if (l != null) break;
    }
    return l;
}

requestLocationUpdates

public class AsyncGetLocation extends AsyncTask<Void,Void,Void> {
private ProgressBar dialog = null;
private Location loc = null;

@Override
protected void onPreExecute()
{

}

@SuppressLint("MissingPermission")
@Override
protected Void doInBackground(Void... Void)
{
    Log.e("doInBackground", "Entered getLocation");
    gpsOps.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0.0f, gpsOps.ls, Looper.getMainLooper());
    return null;
}

@Override
protected void onPostExecute(Void aVoid)
{

}

Неправильная последовательность команд

tempLoc = locs.get(teachers.get(x).get(3));
            if(loc.distanceTo(tempLoc) <= 30*1000)
                rangeFlag = true;
            else
                rangeFlag = false;

1 Ответ

0 голосов
/ 02 июля 2018

Ошибка, вероятно, здесь:

for (int i = providers.size() - 1; i >= 0; i--) {
    l = lm.getLastKnownLocation(providers.get(i));
    if (l != null) break;
}

Если providers.size() равен 0, l будет null .
Таким образом, loc будет ноль .(поскольку loc = gpsOps.getLocation()

Или, если lm.getLastKnownLocation(providers.get(i)); возвращает ноль для всех элементов providers, то, наконец, loc будет ноль .

Вы не упомянули, что такое lm, поэтому мне труднее углубиться в проблему, но я уверен, что проблема лежит внутри того, что происходит в этой ситуации.for loop.

Надеюсь, этот ответ помог

...