2016-08-16 1 views
1

私は、ここにいくつかのデータベースオブジェクトがリリースされたことを私に見せてくれる不思議な問題があります。データベースオブジェクトが最初に閉じられることなくGCによって解放されました

コンソール出力:

SOMETIMES I DROP GC stuff 
WITH FILENAME stuff 
WITH FILENAME stuff 
WITH FILENAME stuff 
**** WARNING! Database object was released by the GC without being closed first! This might cause crashes on iOS ***** 
**** WARNING! Database object was released by the GC without being closed first! This might cause crashes on iOS ***** 
**** WARNING! Database object was released by the GC without being closed first! This might cause crashes on iOS ***** 
WITH FILENAME stuff 
WITH FILENAME stuff 
WITH FILENAME stuff 
AND GC stuff is somewhere here 

および対応する方法

@Override 
    protected boolean initListModelPhotoList(List cmp) { 
     Integer imgHeight = Display.getInstance().getDisplayHeight()/10; 
     Image placeholderImg = fetchResourceFile().getImage("camera_placeholder.png"); 

     System.err.println("SOMETIMES I DROP GC stuff"); 
     Storage storage = Storage.getInstance(); 

     Vector vector = new Vector(); 
     for (xyz.model.Image image : images) { 
      if (!image.getDeleted()) { 
       Hashtable tableItem = new Hashtable(); 
       Image img = null; 
       try { 
        if (!storage.exists(image.getFileName())) { 
         img = placeholderImg; 
         tableItem.put("icon", img.scaled(imgHeight, -1)); 
        } else { 
         InputStream is = storage.createInputStream(image.getFileName()); 
         img = Image.createImage(is); 
         // tableItem.put("icon", img.scaled(imgHeight, -1)); 
         is.close(); 
         System.err.println("WITH FILENAME stuff"); 
        } 
        tableItem.put("emblem", image.getFileName()); 
        tableItem.put("sort", image.getSort()); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       vector.add(tableItem); 
      } 
     } 
     System.err.println("AND GC stuff is somewhere here"); 
     cmp.setModel(new com.codename1.ui.list.DefaultListModel(vector)); 
     return true; 
    } 

私も問題が何であるかをチェックするためのInputStreamに近い()とUtil.cleanup(ある)を実行しようとしましたここに。通常は、このメソッドの各呼び出しでStorage.getInstance()を実装しました。

私はこれを無視することができる場合があるメソッドの誤用があるかどうかは、他の部分にInputstream is後の行をコメントアウトすると、私はコンソール

で、このようなメッセージが表示されますいけないので、ここで尋ねる質問イムがあります?

答えて

2

この警告は、データベース内のカーソルを閉じずに、GCが収集するようにしたことを意味します。それはあなたが投稿したコードとは無関係で、データベース/ SQLパッケージを使用するコードに関連しています。

この警告は、sqliteのののiOSのバージョンはアクセスをスレッドにし、二つのスレッドがアクセスした場合にクラッシュするREALLY敏感であるため、コードMUST適切に近い接続のiOSからあなたを保護することがあります。 GCファイナライザは別のスレッドで実行されるため、これらのオブジェクトのファイナライズに依存するとアプリがクラッシュする可能性があります。

+0

コードを最適化して修正するためにDAOメソッドを少し前にリファクタリングしましたが、メッセージの後に正しく閉じられなかったメソッドを見つけることができました。今少し深く掘り起こすと、もう少しコードを改善できて、今はなくなったと思います。 EDIT:DAOを呼び出したメソッドにエラーがあり、そこから返されたオブジェクトをループして、別のDAOを開いて子オブジェクトを呼び出しました。それは私が監督して閉じてしまうのを忘れた理由です(y)。エラーは 'initList'呼び出しの前に呼び出されたメソッドにもありました – kaya

関連する問題