如何最小化UI中的操作

时间:2015-12-25 16:22:17

标签: android android-layout android-activity

我正在开发一个应用程序,我希望以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 (适用于较少的列或行)。

我该怎么做?

感谢您的时间!!

2 个答案:

答案 0 :(得分:0)

我建议您阅读Google图书讲座

上的完整内容

contact information fields

希望有所帮助

答案 1 :(得分:0)

在为imageView中的图像充电之前,我已经阅读了位图尺寸,并且已经将缩小版本加载到内存 as is recommended in android developers中。多亏了这一点,我避免了在不增加堆内存的情况下内存不足的问题。