0

私のアプリでは、ジオポイントと文字列を保存するために .txt ファイルを使用していたので、.txt から一連の改行を削除するプロセスを実行する代わりに、行を削除するだけで済みました。したがって、データを保存するだけでこれをテストし、正常に保存されますが、データをロードすると、ファイルをデコードする96x96のビットマップでメモリ不足エラーが発生します。意味がありません。

これはlogcatです:

03-28 09:48:30.059: E/dalvikvm-heap(4607): Out of memory on a 46096-byte  allocation.
03-28 09:48:30.059: I/dalvikvm(4607): "main" prio=5 tid=1 RUNNABLE
03-28 09:48:30.059: I/dalvikvm(4607):   | group="main" sCount=0 dsCount=0   obj=0x40a719a0 self=0x2a00bba8
03-28 09:48:30.059: I/dalvikvm(4607):   | sysTid=4607 nice=0 sched=0/0 cgrp=apps    handle=1073849308
03-28 09:48:30.070: I/dalvikvm(4607):   | state=R schedstat=( 9701142608 17839341793 3050 ) utm=828 stm=142 core=0
03-28 09:48:30.070: I/dalvikvm(4607):   at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
03-28 09:48:30.070: I/dalvikvm(4607):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:529)
03-28 09:48:30.070: I/dalvikvm(4607):   at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:302)
03-28 09:48:30.070: I/dalvikvm(4607):   at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:328)
03-28 09:48:30.070: I/dalvikvm(4607):   at com.apps.gonefishing.Information.onCreate(Information.java:80)
03-28 09:48:30.070: I/dalvikvm(4607):   at android.app.Activity.performCreate(Activity.java:5104)
03-28 09:48:30.070: I/dalvikvm(4607):   at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
03-28 09:48:30.070: I/dalvikvm(4607):   at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
03-28 09:48:30.070: I/dalvikvm(4607):   at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
03-28 09:48:30.081: I/dalvikvm(4607):   at android.app.ActivityThread.access$600(ActivityThread.java:141)
03-28 09:48:30.081: I/dalvikvm(4607):   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
03-28 09:48:30.090: I/dalvikvm(4607):   at android.os.Handler.dispatchMessage(Handler.java:99)
03-28 09:48:30.090: I/dalvikvm(4607):   at android.os.Looper.loop(Looper.java:137)
03-28 09:48:30.090: I/dalvikvm(4607):   at android.app.ActivityThread.main(ActivityThread.java:5039)
03-28 09:48:30.090: I/dalvikvm(4607):   at java.lang.reflect.Method.invokeNative(Native Method)
03-28 09:48:30.090: I/dalvikvm(4607):   at   java.lang.reflect.Method.invoke(Method.java:511)
03-28 09:48:30.090: I/dalvikvm(4607):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-28 09:48:30.090: I/dalvikvm(4607):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-28 09:48:30.090: I/dalvikvm(4607):   at dalvik.system.NativeStart.main(Native Method)
03-28 09:48:30.110: D/skia(4607): --- decoder->decode returned false
03-28 09:48:30.110: D/AndroidRuntime(4607): Shutting down VM
03-28 09:48:30.110: W/dalvikvm(4607): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
03-28 09:48:30.140: E/AndroidRuntime(4607): FATAL EXCEPTION: main
03-28 09:48:30.140: E/AndroidRuntime(4607): java.lang.OutOfMemoryError
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:529)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:302)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:328)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at com.apps.gonefishing.Information.onCreate(Information.java:80)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.app.Activity.performCreate(Activity.java:5104)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.os.Handler.dispatchMessage(Handler.java:99)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.os.Looper.loop(Looper.java:137)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at android.app.ActivityThread.main(ActivityThread.java:5039)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at java.lang.reflect.Method.invokeNative(Native Method)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at java.lang.reflect.Method.invoke(Method.java:511)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-28 09:48:30.140: E/AndroidRuntime(4607):     at dalvik.system.NativeStart.main(Native Method)

私が気づいたことの 1 つは、ヒープ メッセージが表示されるたびに、使用可能な空き容量が 5 ~ 6% しかないことです。そのため、エミュレーターを開始してデータを消去しましたが、同じことです。これは api 17 エミュレーターです。テキスト ファイルを使用してアプリを実行すると、完全に実行されました。

次に試すことは、次のとおりです。データベースを開いて読み取る場合でも、次を使用しています:

db = dbHelper.getWritableDatabase();

だから私はそれをに変更するつもりですgetReadableDatabase

それほど大きな変更はなく、エラーのあるこの前のアクティビティでは、すべてが終了します。TextWatcher のキャンバス上で相互に送受信される 2 つのビットマップがあります。.txtファイルで320X480が正常に実行された2つのビットマップのメモリが必要だと思います。

アドバイスをいただければ幸いです。お時間をいただきありがとうございます。

 Cursor cursor;
        db.read();
        cursor = db.getAllEntries();
        boolean go = cursor.moveToFirst();
        while(cursor.isAfterLast() != true){
            Drawable imagebig = null;
            Bitmap photobig = null;
            int lat = cursor.getInt(MyDBAdapter.LATITUDE_COLUMN);
            int lng = cursor.getInt(MyDBAdapter.LONGITUDE_COLUMN);
            GeoPoint recall = new GeoPoint(lat,lng);
            File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Gone");
            file = new File(file.getPath(),"Thumbs");
            String string = cursor.getString(MyDBAdapter.FILE_COLUMN);
            File file1 = new File(file.getPath() + File.separator + "thumb" + string);

            Uri uri = Uri.fromFile(file1);
            if(file1.exists()){
             //photobig = BitmapFactory.decodeFile(file1.getAbsolutePath());
             uri = Uri.fromFile(file1);

             try {
                photobig = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }
        db.close();
        cursor.close();
4

2 に答える 2

0

そして、これを変更します

while(cursor.isAfterLast() != true){

そのために

while(!cursor.isAfterLast()){

それは痛い。*悪い意味でそれを取らないでください:)

于 2013-04-01T21:18:25.643 に答える