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);
}
在这种情况下它将移动到下一行(如果在循环的第一次迭代中游标中有任何行,则从“第一行之前”移动到第一行) 直到没有更多的行。
我正在使用 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);
}
在这种情况下它将移动到下一行(如果在循环的第一次迭代中游标中有任何行,则从“第一行之前”移动到第一行) 直到没有更多的行。