Java.outOfMemory 简单应用程序中的异常

Java.outOfMemory exception in a simple app

我正在使用 recyclerview 来显示一些文本视图。我正在从 SQLite 数据库中收集数据。

这是数据库的助手 class:

package com.example.a7minuteworkoutdemo;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

import java.util.ArrayList;

public class DBHelper extends SQLiteOpenHelper {
    static final String TABLE_NAME="History";
    static final int VERSION=1;
    static final String  ID="id";
    static final String DATE="date";
    public DBHelper(@Nullable Context context, @Nullable SQLiteDatabase.CursorFactory factory) {
        super(context, TABLE_NAME, factory, VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql="CREATE TABLE " + TABLE_NAME + " ( " + ID + " INTEGER PRIMARY KEY, " + " "+DATE+" VARCHAR2(50))";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public void addDate(String date){
        ContentValues cv=new ContentValues();
        cv.put(DATE, date);
        SQLiteDatabase db=getWritableDatabase();
        db.insert(TABLE_NAME, null, cv);
    }

    public ArrayList<String> seeDate(){
        ArrayList<String> dates=new ArrayList<>();
        String sql="SELECT * FROM "+TABLE_NAME;
        SQLiteDatabase db=getReadableDatabase();
        Cursor c=db.rawQuery(sql, null);
        while (c.moveToFirst()){
            String date=c.getColumnName(c.getColumnIndex(DATE));
            dates.add(date);//logcat showing error here
            c.moveToNext();
        }
        c.close();
        return dates;
    }
}

这是我将一些数据插入数据库的代码:

DBHelper dbHelper=new DBHelper(this, null);
        Calendar calendar=Calendar.getInstance();
        Date date=calendar.getTime();
        SimpleDateFormat sdf=new SimpleDateFormat("dd MMM yyyy hh:mm:ss", Locale.getDefault());
        String dateToday=sdf.format(date);
        dbHelper.addDate(dateToday);

这是适配器 class: 包 com.example.a7minuteworkoutdemo;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;

public class HistoryAdapter extends RecyclerView.Adapter<HistoryAdapter.ViewHolder> {

    Context context;
    ArrayList<String> data;

    public HistoryAdapter(Context context, ArrayList<String> data) {
        this.context = context;
        this.data = data;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.history_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.tvTime.setText(data.get(position));
    }

    @Override
    public int getItemCount() {
        return data.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder{
        TextView tvTime;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tvTime=itemView.findViewById(R.id.tvTime);
        }
    }
}

这是我查询数据库并附加 recyclerview 和适配器的地方:

RecyclerView rvHistory=findViewById(R.id.rvHistory);
        DBHelper dbHelper=new DBHelper(this, null);
        HistoryAdapter ha=new HistoryAdapter(this, dbHelper.seeDate());//logcat showing error here
        rvHistory.setAdapter(ha);
        rvHistory.setLayoutManager(new LinearLayoutManager(this));

这里的其他问题已经讲述了使用图像,但我只使用了文本视图。 为什么会导致outOfMemory异常,如何解决?

在数据库助手 DBHelper 方法中 seeDate 你有:

    while (c.moveToFirst()){
        String date=c.getColumnName(c.getColumnIndex(DATE));
        dates.add(date);
        c.moveToNext();
    }

如果游标中有任何行,这将在每次迭代时移动到第一行并且永远不会结束(直到内存给出)。将其更改为:-

    while (c.moveToNext()){
        String date=c.getColumnName(c.getColumnIndex(DATE));
        dates.add(date);
    }

在这种情况下它将移动到下一行(如果在循环的第一次迭代中游标中有任何行,则从“第一行之前”移动到第一行) 直到没有更多的行。