我正在开发一个应用程序,我希望以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行的“大”gridView并且4个cols崩溃了,我得到了一个 java.lang.OutOfMemoryError (适用于较少的列或行)。
我该怎么做?
感谢您的时间!!
答案 0 :(得分:0)
答案 1 :(得分:0)
在为imageView中的图像充电之前,我已经阅读了位图尺寸,并且已经将缩小版本加载到内存 as is recommended in android developers中。多亏了这一点,我避免了在不增加堆内存的情况下内存不足的问题。