gpt4 book ai didi

安卓 "attempted to access a cursor after it has been closed"

转载 作者:太空狗 更新时间:2023-10-29 16:20:57 24 4
gpt4 key购买 nike

我正在尝试调整 HelloGridView例如,这样我就可以显示存储在 SD 中的图像的图像缩略图,而不是 res/drawable 中的图像。这个想法是首先在 ImageView.initialize() 函数中创建一个包含图像的列表,然后使用它与示例中的方法非常相似。

我的光标有问题,首先我尝试在 Imageview.initialize() 函数中将它设为私有(private)(它只是被注释掉所以你可以看到我有它的位置)因为对我来说它似乎是只在那里使用,但后来我收到错误“试图在游标关闭后访问它”。在行的 onCreate() 函数中

gridview.setAdapter(imageAdapter);

所以这一行显然以某种方式使用了它。接下来的尝试是将光标设置为“全局”并在该行之后关闭它,但是我得到了同样的错误但是现在当我离开 onCreate() 时。这就是代码现在的样子,我不知道该怎么做。此外,如果您发现任何其他看起来很奇怪的东西,请告诉我,因为我是 android 和 java 的新手。

package se.mmarks.hellogridview;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

private Cursor imagecursor;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

GridView gridview = (GridView) findViewById(R.id.gridview);
ImageAdapter imageAdapter = new ImageAdapter(this, imagecursor);
imagecursor = imageAdapter.initialize();
gridview.setAdapter(imageAdapter);
/* setAdapter needs the cursor,
* this is why it is closed here and not in ImageAdapter.initialize()
*/
imagecursor.close();

gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(MainActivity.this, "" + position, Toast.LENGTH_SHORT).show();
}
});
}
}



class ImageAdapter extends BaseAdapter {
private ArrayList<ImageView> images = new ArrayList<ImageView>();
Cursor imagecursor = null;


private Context mContext;

public ImageAdapter(Context c, Cursor cursor) {
mContext = c;
imagecursor = cursor;
}

public Cursor initialize() {
final String[] columns = { MediaStore.Images.Thumbnails._ID };
imagecursor = null;
try {
imagecursor = mContext.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, null);
} catch(Exception e) {
e.printStackTrace();
}

if(imagecursor != null){
int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Thumbnails._ID);
int count = imagecursor.getCount();
for (int i = 0; i < count; i++) {
imagecursor.moveToPosition(i);
int id = imagecursor.getInt(image_column_index);
ImageView imageItem = new ImageView(mContext);
imageItem.setId(id);
imageItem.setImageBitmap(
MediaStore.Images.Thumbnails.getThumbnail(mContext.getContentResolver(), id,
MediaStore.Images.Thumbnails.MICRO_KIND, null));
images.add(imageItem);
}
//imagecursor.close();
}
return imagecursor;
}

@Override
public int getCount() {
return imagecursor.getCount();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = images.get(position);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
return imageView;
}
}

最佳答案

Android “attempted to access a cursor after it has been closed”

当您在 Cursor 中工作/访问数据时,需要打开它!

通常建议在 Activity 的生命周期方法 onStop()onDestroy() 中关闭任何数据源游标 方法。

基本示例:

public void onDestroy() {
super.onDestroy();
if (cursor != null) {
c.close();
}
if (db != null) {
db.close();
}
}

关于安卓 "attempted to access a cursor after it has been closed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14921078/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com