2

に深刻な問題がありますListActivity。アプリを開いてスクロールを開始すると、アプリが数秒間フリーズし、その後スムーズにスクロールできます。「アプリケーションが応答していません」というエラーは表示されません。ヒープダンプを作成*.hprofしてMATに入れました。ここで私のリークを見ることができます:

MATによるメモリ分析

メモリリークの疑い

何かが怪しいようです。たぶん私はカーソルを正しい方法で使用していません。ここで私のコードを見ることができます:

public class ListViewActivity extends ListActivity implements OnClickListener {

    // Resources
    static String like;

    // Cursor
    private SimpleCursorAdapter adapter;
    private Cursor cursor;
    String[] showColumns;
    int[] showViews;

    // Database
    private DBAccess dbAccess;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // Remove title bar
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_listview);

        ListViewActivity.like = "";
        Intent intent = getIntent(); // gets the previously created intent
        ListViewActivity.like = intent.getStringExtra("like");

        new DatabaseTask().execute(null, null, null);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {     
        Cursor item = (Cursor) getListAdapter().getItem(position);
        Intent intent = new Intent(ListViewActivity.this, ListClickActivity.class);
        intent.putExtra("id", item.getString(0));
        startActivity(intent);
    }

    private class DatabaseTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            Log.v("doInBackground", "started!");

            dbAccess = new DBAccess(ListViewActivity.this, 1, "FishingMatey.db");

            dbAccess.initDownloadedDatabase();

            cursor = dbAccess
                    .createBewirtschafterListViewCursor(ListViewActivity.like);

            showColumns = new String[] { "gewName", "reviergrenzen" };
            showViews = new int[] { R.id.datensatz_gewName,
                    R.id.datensatz_reviergrenzen };

            Log.v("doInBackground", "finished!");

            return null;
        }

        protected void onPostExecute(Void params) {
            adapter = new SimpleCursorAdapter(ListViewActivity.this,
                    R.layout.datensatz, cursor, showColumns, showViews);

            setListAdapter(adapter);

            dbAccess.closeDatabase();

            Log.v("onPostExecute", "finished!");
        }
    }
}

編集1:
次のコードで同じリークがあるため、この問題はデータベースから発生していません。

public class ListViewActivity extends ListActivity {
// Activity
public static Activity forFinish;

// Resources
static String like;

// Cursor
private SimpleAdapter adapter;
String[] showColumns;
int[] showViews;

@Override
public void onCreate(Bundle savedInstanceState) {
    // Remove title bar
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_listview);

    forFinish = this;
    
    ListViewActivity.like = "";
    Intent intent = getIntent(); // gets the previously created intent
    ListViewActivity.like = intent.getStringExtra("like");

    // create the grid item mapping

    showColumns = new String[] { "gewName", "reviergrenzen" };
    showViews = new int[] { R.id.datensatz_gewName,
            R.id.datensatz_reviergrenzen };

    // prepare the list of all records
    List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();

    for (int i = 0; i < 20; i++) {
        HashMap<String, String> map = new HashMap<String, String>();
        map.put("gewName", "See" + i);
        map.put("reviergrenzen", "Revier" + i);
        fillMaps.add(map);

    }
    // fill in the grid_item layout

    SimpleAdapter adapter = new SimpleAdapter(this, fillMaps,
            R.layout.datensatz, showColumns, showViews);

    setListAdapter(adapter);

}
}

誰かがメモリリークを見つけることができれば素晴らしいでしょう。
マイクさん、こんにちは!

4

1 に答える 1

0

リスト アイテムで画像を使用している場合は、画像の読み込みをバックグラウンド タスクに移動します。パフォーマンスを向上させるためにAndroid-BitmapCacheで使用できる非同期ローディング リストであるSmoothieをご覧ください。

于 2013-02-18T16:38:20.333 に答える