2013-03-18 4 views
0

Я пытаюсь создать приложение для своих исследований, которое является отслеживающим спортом.Android: Исключение Null Pointer в приложении GPS

Когда я посылаю новую локализацию, мой сбой приложения из-за этой ошибки:

03-18 18:44:34.662: E/AndroidRuntime(1085): FATAL EXCEPTION: main 
03-18 18:44:34.662: E/AndroidRuntime(1085): java.lang.NullPointerException 
03-18 18:44:34.662: E/AndroidRuntime(1085): at android.app.Activity.findViewById(Activity.java:1839) 
03-18 18:44:34.662: E/AndroidRuntime(1085): at fr.polytech.trackersportif.GPSData.onLocationChanged(GPSData.java:28) 
03-18 18:44:34.662: E/AndroidRuntime(1085): at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:255) 
03-18 18:44:34.662: E/AndroidRuntime(1085): at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:184) 
03-18 18:44:34.662: E/AndroidRuntime(1085): at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:200) 
03-18 18:44:34.662: E/AndroidRuntime(1085): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-18 18:44:34.662: E/AndroidRuntime(1085): at android.os.Looper.loop(Looper.java:137) 
03-18 18:44:34.662: E/AndroidRuntime(1085): at android.app.ActivityThread.main(ActivityThread.java:5039) 
03-18 18:44:34.662: E/AndroidRuntime(1085): at java.lang.reflect.Method.invokeNative(Native Method) 
03-18 18:44:34.662: E/AndroidRuntime(1085): at java.lang.reflect.Method.invoke(Method.java:511) 
03-18 18:44:34.662: E/AndroidRuntime(1085): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
03-18 18:44:34.662: E/AndroidRuntime(1085): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
03-18 18:44:34.662: E/AndroidRuntime(1085): at dalvik.system.NativeStart.main(Native Method) 

Мой mainActivity является:

locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
locationListener = new GPSData(); 
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, locationListener); 

И чтобы закончить мой класс (GPSData) является:

public class GPSData extends Activity implements LocationListener{ 

TextView textLong, textLat; 



protected void onCreate(Bundle savedInstanceState) { 
    //super.onCreate(savedInstanceState);  
    setContentView(R.layout.page_accueil); //page_acceuil is the layout where are the two textview that I want set text 
} 

@Override 
public void onLocationChanged(Location location) { 

    textLong = (TextView) findViewById(R.id.textView1); 
    textLat = (TextView) findViewById(R.id.textView3); 

    textLong.setText(String.valueOf(location.getLongitude())); 
    textLat.setText(String.valueOf(location.getLatitude()));   
} 

Я пробую разные вещи с двух дней, но у меня есть эта ошибка снова и снова.

Вы можете мне помочь?

+0

Где вы тестируете свое приложение? –

+0

Класс GPSData не должен расширять Activity. GPSData должен быть частным классом внутри mainActivity, который реализует LocationListener. – BrianPlummer

ответ

0

Вы не можете протестировать свое приложение на основе геоданных в эмуляторе, не указав для него длинные координаты lat, используя telnet и команду geo fix lat coordinate long coordinate.

+0

БОЛЬШОЙ вопиющей ошибкой здесь является неправильное предположение, что LocationListener вызывает активность ....... – BrianPlummer

0

Вы должны включить GPSData в mainactivity. Вы можете получить доступ к (TextView) findViewById (R.id.textView1); в MainActivity

И MainActivity.this.findViewById (R.id.textView1);

0

Вызов new - это неправильный способ начать Activity. Ваш NullPointerException, скорее всего, бросаются на линии:

textLong.setText(String.valueOf(location.getLongitude())); 

Это потому, что создание нового Activity по телефону new не вызывает метод onCreate. Таким образом, ваш класс GPSData никогда не имеет вида, потому что setContentView не вызывается. Это означает, что вызов findViewById с одним из ваших собственных идентификаторов просмотра всегда будет возвращаться null.

Вместо того, чтобы настраивать LocationListener с MainActivity, я рекомендую сделать это в вашем классе GPSData. Чтобы сделать это, вы должны сделать следующие изменения:

MainActivity:

Intent intent = new Intent(this, GPSData.class); 
startActivity(intent); 

GPSData:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.page_accueil); 

    LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, this); 
} 

Вы должны быть в состоянии оставить остальную часть вашего GPSData класса в одиночку. Только измените метод onCreate, чтобы он соответствовал этому.

Это все, если вы действительно хотите, чтобы GPSData был отдельным Activity, как ваш код установлен. Если вы не хотите, чтобы он был отдельным Activity, я бы рекомендовал сделать GPSData частным внутренним классом и сделать его не продлевающим Activity, как предлагалось BrianPlummer. В этом случае ваш класс GPSData будет выглядеть так:

private class GPSData implements LocationListener { 

    TextView textLong; 
    TextView textLat; 

    public GPSData() { 
     textLong = (TextView) findViewById(R.id.textView1); 
     textLat = (TextView) findViewById(R.id.textView3); 
    } 

    @Override 
    public void onLocationChanged(Location location) {  
     textLong.setText(String.valueOf(location.getLongitude())); 
     textLat.setText(String.valueOf(location.getLatitude()));   
    } 
} 
+0

Спасибо за ваш ответ, но я думаю, что я ошибаюсь, когда я отделяю Activity. Но я не понимаю, как можно сделать GPSData в частном внутреннем классе. Можете ли вы объяснить более подробно? – boboch

+0

Затем вы можете следовать совету внизу ответа, чтобы сделать 'GPSData' не расширением' Activity' и сделать его внутренним классом. – MCeley

+0

ОК, но если я удалю «продлить действие», можно ли установить текст Textview? – boboch

Смежные вопросы