我正在开发一个应用程序,并且想在gridview中(以编程方式创建)显示一些随机出现的图像。我将图像保存在drawables文件夹中,并且从数据库中获得了图像的名称。我的问题是从数据库(列表)中获取数据,随机地重新组织并创建gridView的视图需要花费太多时间。我尝试使用异步任务获取随机列表,但由于尚未创建列表,因此在我开始创建gridView时收到nullPointerException。如果我等到创建列表,就会遇到同样的问题。
我将向您解释游戏的情况,这将帮助您理解为什么我会在活动中进行随机重组。
在数据库中,我有成对的字符(受害者和凶手),在活动中我所需要的比我要多,因为每次打开应用程序时我都希望得到不同的字符。因此,我从数据库中获得了随机配对的角色列表(受害者和凶手)。之后,我必须将它们显示在gridView中,并且必须将它们无序显示,这是我认为很耗时的方法(实际上是该方法和SQLite数据库查询)。我必须重新组织两次清单,因为我需要有相同数量的受害者和凶手。
我现在将向您展示我正在使用的代码
protected void onCreate(Bundle savedInstanceState) {
Intent intent = getIntent();
numRows = intent.getIntExtra("NumRows", 1);
numColumns = intent.getIntExtra("NumColumns", 1);
totalTime = intent.getIntExtra("Time", 30);
level = intent.getIntExtra("Level", 1);
....
new PrepareListMurder(this, level, numRows, numColumns).execute();
preferences = PreferenceManager.getDefaultSharedPreferences(this);
mGridLayout = (GridLayout) findViewById(R.id.gridLayout);
mGridLayout.setColumnCount(numColumns);
mGridLayout.setRowCount(numRows);
//DBUtilities = DataBaseUtilities.getInstance(this);
Point size = new Point();
getWindowManager().getDefaultDisplay().getSize(size);
int screenWidth = size.x;
int screenHeight = size.y;
int margin = 10;
for (int i=0; i<numRows; i++){
for (int j=0; j<numColumns; j++){
int aux = i;
GridLayout.Spec row = spec(i);
GridLayout.Spec col = spec(j);
ImageView img = createImageView(pos);
GridLayout.LayoutParams params = createParams(row, col, margin, screenWidth, screenHeight);
mGridLayout.addView(img, params);
pos++; }
}
这些是创建imageView和LayoutParams的方法。(subList是包含字符名称的随机排序列表,我应该通过异步任务来获取它
private ImageView createImageView(int pos){
ImageView img = new ImageView(this);
String character = subList.get(pos);
Log.d("lista", subList.toString());
int img_id = this.getResources().getIdentifier(character.toLowerCase().replace(" ", "_"), "drawable", this.getPackageName());
img.setImageResource(img_id);
img.setScaleType(ImageView.ScaleType.CENTER_CROP);
img.setAdjustViewBounds(true);
img.setOnClickListener(this);
img.setTag(character);
return img;
}
private GridLayout.LayoutParams createParams(GridLayout.Spec row, GridLayout.Spec col, int margin, int screenWidth, int screenHeight){
GridLayout.LayoutParams params = new GridLayout.LayoutParams(row, col);
params.width = screenWidth / numColumns - 2*margin;
params.height = screenHeight / numRows - 2*margin;
params.setMargins(margin, margin, margin, margin);
return params;
}
这是用于创建字符列表的代码
public class PrepareListMurder extends AsyncTask<Void, Void, List<String>> {
private ProgressDialog pDialog;
private Context context;
private String errorMesaje;
private int level;
private int numRows;
private int numColumns;
public PrepareListMurder(Context context, int level, int nR, int nC){
this.context = context;
this.level = level;
this.numColumns = nC;
this.numRows = nR;
}
protected List<String> doInBackground(Void... params) {
DataBaseUtilities DBUtilities = DataBaseUtilities.getInstance(context);
ArrayList<String> mMurderVictimList = DBUtilities.getSelectedMurderStringList(level);
List<String> subList = new ArrayList<>(mMurderVictimList.subList(0,numRows*numColumns));
Collections.shuffle(subList);
return subList;
}
@Override
protected void onPostExecute(List<String> chars) {
super.onPostExecute(chars);
((CallBackFile) context).createListMurder(chars);
pDialog.dismiss();
}
我在doInBackground()中使用的代码是我以前在该活动的onCreate()中使用的代码,但是该活动花费了太长时间才能打开,并且如果我想显示一个具有4行4列的“大” gridView崩溃,我得到一个java.lang.OutOfMemoryError(工作较少的列或行即可正常工作)。
我该怎么做?
谢谢你的时间!!
在将图像加载到imageView中之前,我已经阅读了位图尺寸,并且已按照Android开发人员的建议将缩小版本加载到内存中。因此,我避免了在不增加堆内存的情况下耗尽内存的问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句