Как я могу предотвратить принудительное закрытие моего приложения?

#java #android

#java #Android

Вопрос:

Я создаю пример приложения для определения местоположения по GPS на моем Evo 4G. В конечном итоге это будет интегрировано в приложение для использования тайм-карт. Но оно принудительно закрывается. У меня нет никаких идей, почему… Любая помощь?

 package com.Rick.GPS;

import android.app.Activity;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class Main extends Activity implements LocationListener {

/* this class implements LocationListener, which listens for both
 * changes in the location of the device and changes in the status
 * of the GPS system.
 * */

static final String tag = "Main"; // for Log

TextView txtInfo;
LocationManager lm;
StringBuilder sb;
int noOfFixes = 0;

/** Called when the activity is first created. */

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    /* get TextView to display the GPS data */
    txtInfo = (TextView) findViewById(R.id.Text1);

    /* the location manager is the most vital part it allows access
     * to location and GPS status services */
    lm = (LocationManager) getSystemService(LOCATION_SERVICE);
}


protected void onResume() {
    /*
     * onResume is is always called after onStart, even if the app hasn't been
     * paused
     *
     * add location listener and request updates every 1000ms or 10m
     */
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10f, this);
    super.onResume();
}


protected void onPause() {
    /* GPS, as it turns out, consumes battery like crazy */
    lm.removeUpdates(this);
    super.onPause();
}


public void onLocationChanged(Location location) {
    Log.v(tag, "Location Changed");

    sb = new StringBuilder(512);

    noOfFixes  ;

    /* display some of the data in the TextView */

    sb.append("No. of Fixes: ");
    sb.append(noOfFixes);
    sb.append('n');
    sb.append('n');

    sb.append("Londitude: ");
    sb.append(location.getLongitude());
    sb.append('n');

    sb.append("Latitude: ");
    sb.append(location.getLatitude());
    sb.append('n');

    sb.append("Altitiude: ");
    sb.append(location.getAltitude());
    sb.append('n');

    sb.append("Accuracy: ");
    sb.append(location.getAccuracy());
    sb.append('n');

    sb.append("Timestamp: ");
    sb.append(location.getTime());
    sb.append('n');

    txtInfo.setText(sb.toString());
}


public void onProviderDisabled(String provider) {
    /* this is called if/when the GPS is disabled in settings */
    Log.v(tag, "Disabled");

    /* bring up the GPS settings */
    Intent intent = new Intent(
            android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
    startActivity(intent);
}


public void onProviderEnabled(String provider) {
    Log.v(tag, "Enabled");
    Toast.makeText(this, "GPS Enabled", Toast.LENGTH_SHORT).show();

}


public void onStatusChanged(String provider, int status, Bundle extras) {
    /* This is called when the GPS status alters */
    switch (status) {
    case LocationProvider.OUT_OF_SERVICE:
        Log.v(tag, "Status Changed: Out of Service");
        Toast.makeText(this, "Status Changed: Out of Service",
                Toast.LENGTH_SHORT).show();
        break;
    case LocationProvider.TEMPORARILY_UNAVAILABLE:
        Log.v(tag, "Status Changed: Temporarily Unavailable");
        Toast.makeText(this, "Status Changed: Temporarily Unavailable",
                Toast.LENGTH_SHORT).show();
        break;
    case LocationProvider.AVAILABLE:
        Log.v(tag, "Status Changed: Available");
        Toast.makeText(this, "Status Changed: Available",
                Toast.LENGTH_SHORT).show();
        break;
    }
}


protected void onStop() {
    /* may as well just finish since saving the state is not important for this toy app */
    finish();
    super.onStop();
}
}
  

Вот файл макета…

 <TextView
    android:id="@ id/Text1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello" />
  

И вот манифест…

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.Rick.GPS"
android:versionCode="1"
android:versionName="1.0" >

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-sdk android:minSdkVersion="10" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
        android:label="@string/app_name"
        android:name=".GPSActivity" >
        <intent-filter >
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>
  

Спасибо за любую помощь, которую вы можете мне оказать…

Комментарии:

1. Найдите исключение в файле журнала. Это должно подсказать вам, в чем заключается проблема. (Чтобы просмотреть LogCat в Eclipse, откройте представление LogCat (Окно> Показать вид> Другое …, затем выберите LogCat под Android).).

Ответ №1:

Две ошибки, которые я смог заметить:

  1. Вам нужен вызов setContentView(R.layout.main); , не комментируйте это. в противном случае вы получите исключение NullPointerException в следующей строке.
  2. В XML, который вы определяете Text1 как EditText , но в вашем классе вы пытаетесь преобразовать его в TextView , и вы получаете исключение приведения класса. Измените его либо в XML, либо в файле java. Согласно вашему комментарию в коде, вы должны изменить его в XML.

Комментарии:

1. Спасибо, я изменил оба … по-прежнему принудительно закрывает журнал состояния cat: «ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: main»

Ответ №2:

  protected void onPause() {     /* GPS, as it turns out, consumes battery like crazy */     lm.removeUpdates(this);     super.onPause(); }  
  

ТАКЖЕ прокомментирован код setContentView…

Ответ №3:

Имеет ли onLocationChange доступ к текстовому полю? В любом случае, я думаю, что лучшим способом разработки этого приложения было бы выполнить прослушивание местоположения в отдельном интерфейсе и, например, использовать обработчик для обновления потока пользовательского интерфейса. Этот подход также устраняет риск того, что исправление местоположения может заблокировать поток пользовательского интерфейса.

Ответ №4:

Вы вызываете super.onResume в теле вашего метода onPause.