安卓模拟器为什么会显示“很抱歉,我的应用程序已停止运行”?

4

我尝试制作一款使用GPS的Android应用程序进行地理定位,但当我运行模拟器时,我收到这条消息:appname不幸停止。 为什么会出现这种情况?我的代码没有错误。

我的 .java 文件:

package com.android.geolocalisation3;

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;

import android.os.Bundle;

import android.view.KeyEvent;
import android.view.Menu;

import android.widget.Toast;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

public class Geo3MainActivity extends MapActivity implements LocationListener {

    private MapView mapView;
    private MapController mc;

    private LocationManager lm;

    private double latitude=122;
    private double longitude=37;
    private double altitude=0;
    private float accuracy=0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_geo3_main);

        mapView = (MapView) this.findViewById(R.id.mapView);
        mapView.setBuiltInZoomControls(true);

        mc = mapView.getController();
        mc.setZoom(17);
    }

    @Override
    protected void onResume() {
        super.onResume();
        lm = (LocationManager) this.getSystemService(LOCATION_SERVICE);
        if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER))
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0,
                    this);
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 0,
                this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        lm.removeUpdates(this);
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
            mapView.setSatellite(true);
            return true;
        } else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
            mapView.setSatellite(false);
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_geo3_main, menu);
        return true;
    }

    @Override
    public void onLocationChanged(Location location) {

        //altitude = location.getAltitude();
        ///accuracy = location.getAccuracy();

        String msg = String.format(
                getResources().getString(R.string.new_location), latitude,
                longitude, altitude, accuracy);
        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();

        GeoPoint p = new GeoPoint((int) (latitude * 1E6), (int) (longitude * 1E6));
        mc.animateTo(p);
        mc.setCenter(p);
    }

    @Override
    public void onProviderDisabled(String provider) {
        String msg = String.format(
                getResources().getString(R.string.provider_disabled), provider);
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onProviderEnabled(String provider) {
        String msg = String.format(
                getResources().getString(R.string.provider_enabled), provider);
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        String newStatus = "";
        switch (status) {
        case LocationProvider.OUT_OF_SERVICE:
            newStatus = "OUT_OF_SERVICE";
            break;
        case LocationProvider.TEMPORARILY_UNAVAILABLE:
            newStatus = "TEMPORARILY_UNAVAILABLE";
            break;
        case LocationProvider.AVAILABLE:
            newStatus = "AVAILABLE";
            break;
        }
        String msg = String.format(
                getResources().getString(R.string.provider_disabled), provider,
                newStatus);
        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    }
}

我的日志错误:

07-28 00:00:01.054: E/StrictMode(621): A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
07-28 00:00:01.054: E/StrictMode(621): java.lang.Throwable: Explicit termination method 'close' not called
07-28 00:00:01.054: E/StrictMode(621):  at dalvik.system.CloseGuard.open(CloseGuard.java:184)
07-28 00:00:01.054: E/StrictMode(621):  at android.database.CursorWindow.<init>(CursorWindow.java:137)
07-28 00:00:01.054: E/StrictMode(621):  at android.database.CursorWindow.<init>(CursorWindow.java:41)
07-28 00:00:01.054: E/StrictMode(621):  at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:681)
07-28 00:00:01.054: E/StrictMode(621):  at android.database.CursorWindow$1.createFromParcel(CursorWindow.java:679)
07-28 00:00:01.054: E/StrictMode(621):  at android.database.BulkCursorDescriptor.readFromParcel(BulkCursorDescriptor.java:75)
07-28 00:00:01.054: E/StrictMode(621):  at android.database.BulkCursorDescriptor$1.createFromParcel(BulkCursorDescriptor.java:34)
07-28 00:00:01.054: E/StrictMode(621):  at android.database.BulkCursorDescriptor$1.createFromParcel(BulkCursorDescriptor.java:30)
07-28 00:00:01.054: E/StrictMode(621):  at android.content.ContentProviderProxy.query(ContentProviderNative.java:369)
07-28 00:00:01.054: E/StrictMode(621):  at android.content.ContentResolver.query(ContentResolver.java:370)
07-28 00:00:01.054: E/StrictMode(621):  at android.content.CursorLoader.loadInBackground(CursorLoader.java:65
07-28 00:00:01.054: E/StrictMode(621):  at android.content.CursorLoader.loadInBackground(CursorLoader.java:43)
07-28 00:00:01.054: E/StrictMode(621):  at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:301)
07-28 00:00:01.054: E/StrictMode(621):  at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:68)
07-28 00:00:01.054: E/StrictMode(621):  at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:56)
07-28 00:00:01.054: E/StrictMode(621):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-28 00:00:01.054: E/StrictMode(621):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-28 00:00:01.054: E/StrictMode(621):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-28 00:00:01.054: E/StrictMode(621):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-28 00:00:01.054: E/StrictMode(621):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-28 00:00:01.054: E/StrictMode(621):  at java.lang.Thread.run(Thread.java:856)
07-28 00:00:01.144: E/StrictMode(621): A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
07-28 00:00:01.144: E/StrictMode(621): java.lang.Throwable: Explicit termination method 'close' not called
07-28 00:00:01.144: E/StrictMode(621):  at dalvik.system.CloseGuard.open(CloseGuard.java:184)
07-28 00:00:01.144: E/StrictMode(621):  at android.content.ContentResolver$CursorWrapperInner.<init>(ContentResolver.java:1835)
07-28 00:00:01.144: E/StrictMode(621):  at android.content.ContentResolver.query(ContentResolver.java:392)
07-28 00:00:01.144: E/StrictMode(621):  at android.content.CursorLoader.loadInBackground(CursorLoader.java:65)
07-28 00:00:01.144: E/StrictMode(621):  at android.content.CursorLoader.loadInBackground(CursorLoader.java:43)
07-28 00:00:01.144: E/StrictMode(621):  at android.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:301)
07-28 00:00:01.144: E/StrictMode(621):  at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:68)
07-28 00:00:01.144: E/StrictMode(621):  at android.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:56)
07-28 00:00:01.144: E/StrictMode(621):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-28 00:00:01.144: E/StrictMode(621):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
07-28 00:00:01.144: E/StrictMode(621):  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
07-28 00:00:01.144: E/StrictMode(621):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
07-28 00:00:01.144: E/StrictMode(621):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
07-28 00:00:01.144: E/StrictMode(621):  at java.lang.Thread.run(Thread.java:856)
07-28 00:00:45.364: E/PowerManagerService(157): Excessive delay setting brightness: 144ms, mask=2
07-28 00:00:45.544: E/PowerManagerService(157): Excessive delay setting brightness: 139ms, mask=2
07-28 00:00:45.764: E/PowerManagerService(157): Excessive delay setting brightness: 211ms, mask=2
07-28 00:00:45.994: E/PowerManagerService(157): Excessive delay setting brightness: 224ms, mask=2
07-28 00:05:21.293: E/ThrottleService(157): problem during onPollAlarm: java.lang.IllegalStateException: problem parsing stats: java.io.FileNotFoundException: /proc/net/xt_qtaguid/iface_stat_all: open failed: ENOENT (No such file or directory)

@Jon,这是SO政策。我已经翻译了这个问题,但那只是一种礼貌。 - Michael Petrotta
无论如何,作为对问题的评论,模拟器是否支持GPS? - Jon Taylor
给你,@Jon。在Stack Overflow上需要使用英语吗? - Michael Petrotta
我已经添加了GPS支持 -> 模拟器中出现的同样的消息是"很遗憾,应用已停止"。 - amina
2个回答

3
一些日志信息的格式丢失了,导致它们很难阅读。
日志信息的前几行给出了提示:
07-28 00:00:01.054: E/StrictMode(621): A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
07-28 00:00:01.054: E/StrictMode(621): java.lang.Throwable: Explicit termination method 'close' not called

某些对象,如文件或游标,需要显式关闭。简单地丢弃对它们的引用是不够的。未能关闭对象会导致资源泄漏,系统会检测并通过终止您的应用程序来做出反应。
不幸的是,堆栈跟踪只会显示检测到泄漏的位置,而不是最初导致它的原因。
您是否有些代码没有向我们展示与数据库相关的部分?日志消息表明存在 Cursor 对象的问题。
假设您正在使用数据库,请查看您的数据库访问代码,并确保关闭每个打开的游标和数据库。确保在数据库处理函数中的所有“return”语句之前关闭相关对象。确保捕获所有可能的异常并在将异常上升到堆栈之前关闭游标对象。我经常使用 finally{} 块来实现这一点。
我的数据库代码通常如下所示:
protected DbRec findById(String ident) {
    DbRec rval;
    Cursor cursor = null;
    try {
        if( (cursor = findCursorById(ident)) == null )
            return null;
        rval = newRecord();
        rval.fillFromCursor(cursor);
    } catch (Exception e) {
        Log.w(TAG, "Failed to read database record: " + e);
        rval = null;
    } finally {
        if( cursor != null ) cursor.close();
    }
    return rval;
}

ETA:我已经自行复制了您在评论中的日志信息:
E/AndroidRuntime(808): java.lang.RuntimeException: Unable to resume activity {com.android.geolocalisation3/com.android.geolocalisation3.Geo3MainActivity}: java.lang.IllegalArgumentException: requested provider network doesn't exisit
E/AndroidRuntime(808): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2575)
E/AndroidRuntime(808): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2603)
E/AndroidRuntime(808): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2089)
E/AndroidRuntime(808): at android.app.ActivityThread.access$600(ActivityThread.java:130)
E/AndroidRuntime(808): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
E/AndroidRuntime(808): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(808): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(808): at android.app.ActivityThread.main(ActivityThread.java:4745)
E/AndroidRuntime(808): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(808): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(808): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/AndroidRuntime(808): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime(808): at dalvik.system.NativeStart.main(Native Method)

E/AndroidRuntime(808): Caused by: java.lang.IllegalArgumentException: requested provider network doesn't exisit
E/AndroidRuntime(808): at android.os.Parcel.readException(Parcel.java:1429)
E/AndroidRuntime(808): at android.os.Parcel.readException(Parcel.java:1379)
E/AndroidRuntime(808): at android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:646)
E/AndroidRuntime(808): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:660)
E/AndroidRuntime(808): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:482)
E/AndroidRuntime(808): at com.android.geolocalisation3.Geo3MainActivity.onResume(Geo3MainActivity.java:49)
E/AndroidRuntime(808): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1184)
E/AndroidRuntime(808): at android.app.Activity.performResume(Activity.java:5082)
E/AndroidRuntime(808): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2565)
E/AndroidRuntime(808): ... 12 more

这个错误与之前不同。看起来位置提供程序的名称(例如“gps”)在onSaveInstanceState()中保存错误,导致应用程序重新启动时崩溃。


E/(): 设备已断开连接 07-30 08:58:19.618: E/Trace(808): 打开跟踪文件时出错:没有这样的文件或目录(2) 07-30 08:58:21.758: E/AndroidRuntime(808): 致命异常:主要原因在于无法恢复活动{com.android.geolocalisation3/com.android.geolocalisation3.Geo3MainActivity}:java.lang.IllegalArgumentException: 请求的提供程序网络不存在 - amina
07-30 08:58:21.758: E/AndroidRuntime(808): 在android.app.ActivityThread.performResumeActivity(ActivityThread.java:2575) 07-30 08:58:21.758: E/AndroidRuntime(808): 在android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2603) 07-30 08:58:21.758: E/AndroidRuntime(808): 在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2089) 07-30 08:58:21.758: E/AndroidRuntime(808): 在android.app.ActivityThread.access$600(ActivityThread.java:130) - amina
07-30 08:58:21.758: E/AndroidRuntime(808): 在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 07-30 08:58:21.758: E/AndroidRuntime(808): 在android.os.Handler.dispatchMessage(Handler.java:99) 07-30 08:58:21.758: E/AndroidRuntime(808): 在android.os.Looper.loop(Looper.java:137) 07-30 08:58:21.758: E/AndroidRuntime(808): 在android.app.ActivityThread.main(ActivityThread.java:4745) - amina
07-30 08:58:21.758: E/AndroidRuntime(808): 在dalvik.system.NativeStart.main(Native Method)处 07-30 08:58:21.758: E/AndroidRuntime(808): 引起的错误:java.lang.IllegalArgumentException: 请求的提供程序网络不存在 07-30 08:58:21.758: E/AndroidRuntime(808): 位于android.os.Parcel.readException(Parcel.java:1429) 07-30 08:58:21.758: E/AndroidRuntime(808): 位于android.os.Parcel.readException(Parcel.java:1379) - amina
07-30 08:58:21.758: E/AndroidRuntime(808): 在android.location.ILocationManager$Stub$Proxy.requestLocationUpdates(ILocationManager.java:646) 07-30 08:58:21.758: E/AndroidRuntime(808): 在android.location.LocationManager._requestLocationUpdates(LocationManager.java:660) 07-30 08:58:21.758: E/AndroidRuntime(808): 在android.location.LocationManager.requestLocationUpdates(LocationManager.java:482) 07-30 08:58:21.758: E/AndroidRuntime(808): 在com.android.geolocalisation3.Geo3MainActivity.onResume(Geo3MainActivity.java:49) - amina
显示剩余3条评论

0

由于某种原因,API级别为16的模拟器无法注册NETWORK_PROVIDER监听器。在10级别的模拟器中它运行得很好。我没有测试其他SDK版本。

我刚刚添加了一个检查网络提供程序可用性的功能,以避免此问题。你已经为GPS提供程序做了这个检查。

if (lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER))

希望这能有所帮助。

J


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接