Это важно
EXCEPTION: main 04-14 02:41:42.782: ERROR/AndroidRuntime(13759): java.lang.NullPointerException
ERROR/AndroidRuntime(13759): at com.irwine.touristapplication.MyLocOverlay.draw(MyLocOverlay.java:23)
Если бы мне пришлось угадывать, я бы сказал, что ваше местоположение нулевое.Попробуйте запустить в режиме отладки и посмотрите, что вы можете найти.Я предлагаю поставить точку останова ДО строки ошибки и посмотреть, что это за переменные ... если ваша переменная местоположения равна нулю, это ваша проблема, способ исправить это - продолжать пинговать до тех пор, пока вы ее не получите ..
Решение состоит в том, чтобы проверить, является ли местоположение нулевым. Если оно является нулевым, то это означает, что вам нужно запросить местоположение снова.Если вы пытаетесь пинговать в течение 20 секунд и ничего не получаете, продолжайте пинговать, пока не получите что-то.В идеале вы хотите, чтобы время истекло после 5 попыток ... Это потому, что если вы пингуетесь постоянно, пользователь будет ненавидеть вас .Тем не мение;Если пройдут 100 секунд, и вы не получите местоположение, то время ожидания и попросите пользователя снова запросить это местоположение или попросить его повторить попытку позже.
ОБНОВЛЕНИЕ
В частности, я вижу ошибку с этим.Вот как я бы подошел к этому:
Запрос местоположения -> Ожидание местоположения через слушателя местоположения -> После получения местоположений обновите оверлей.
Продолжайте запрашивать, пока возвращаемое местоположение является нулевым.Тайм-аут, как я сказал.
Вот пример:
мой класс LocationListener:
public class myLocationListener implements LocationListener {
Location L;
public void onLocationChanged(Location arg0) {
Toast.makeText(getApplicationContext(), "Location has changed",
Toast.LENGTH_SHORT).show();
L = arg0;
updateNewLocation(L);
}}
Функция, которую я вызываю:
public void updateNewLocation(Location loc) {
// while the location is not null get latitude and longitude
// information
// :: Null means that the GPS provider is off or there is an issue
if (loc != null) {}}
ФункцияТело, которое я использую для запроса местоположения вместе с таймаутом:
Toast.makeText(getApplicationContext(),
"Searching for your location.", Toast.LENGTH_SHORT)
.show();
locationManager.requestLocationUpdates(provider, 20000, 5,
locationListener);
// Thread to count until timeout (15 * 5000ms)
Thread t = new Thread(new Runnable() {
public void run() {
count = 0;
for (int i = 0; i < 15; i++) {
if (locationListener.L == null) {
try {
handler.sendMessage(handler
.obtainMessage());
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Обработчик, чтобы помочь с таймаутом
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
count++;
if (count == 15) {
error();
count = 0;
}
}
};