2013-03-18 42 views
0

我嘗試爲我的研究創建一個跟蹤sportif的應用程序。Android:空指針例外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

您要測試您的應用程序? – 2013-03-18 19:00:49

+0

GPSData類不應擴展Activity。 GPSData應該是實現LocationListener的mainActivity中的私有類。 – BrianPlummer 2013-03-18 19:03:27

回答

0

您無法使用telnetgeo fix lat coordinate long coordinate命令在仿真程序中測試基於地理位置的應用程序,而無需指定緯度座標。

+0

這裏的BIG明顯的錯誤是一個不正確的假設,即LocationListener正在調用一個Activity ....... – BrianPlummer 2013-03-18 19:07:50

0

你必須把GPSData放入主要活動。你只能訪問(TextView)findViewById(R.id.textView1);在MainActivity

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

0

調用new不是啓動Activity的正確方法。你NullPointerException是最有可能被扔就行了:

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

這是因爲,通過調用new不會觸發onCreate方法創建一個新的Activity。因此,您的GPSData類永遠不會設置視圖,因爲setContentView未被調用。這意味着打電話findViewById與您自己的觀點ID將始終返回null

而不是從MainActivity設置您的LocationListener,我建議您在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成爲一個私人內部類,並使它不像BrianPlummer建議的那樣延伸Activity。在這種情況下,您的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 2013-03-18 20:16:19

+0

然後,您可能需要按照答案底部的建議,使「GPSData」不會擴展「Activity」並將其作爲內部類。 – MCeley 2013-03-18 20:17:26

+0

好的,但如果我刪除「擴展活動」,是否可以設置文本視圖的文本? – boboch 2013-03-18 20:22:33