GC_CONCURRENT问题

时间:2012-09-24 03:58:07

标签: android android-sqlite

这家伙一直在努力让我的应用程序冻结,任何方法来解决这个问题?

这是我的代码:

import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class StartMoving extends Activity implements OnClickListener {

    Button managemove, returnBack, manageroom, settings, kitchen, addmove;
    ImageButton add1;
    EditText newMove;
    TextView roomName, listMove, roomContent, itemValue;
    CheckBox cbox1;
    Dialog d;
    LinearLayout roomButtons, addRooms;
    RelativeLayout main, merge;
    int check = 0;
    int inc = 1;
    String currentMove = null;
    String currentRoom = null;
    String currentItem = null;
    String currentItemValue = null;
    int itemval = 1;
    boolean notavailroom = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.start_moving);

        roomName = (TextView) findViewById(R.id.tvRoomName);

        managemove = (Button) findViewById(R.id.bManageMove);

        manageroom = (Button) findViewById(R.id.bManageRooms);

        merge = (RelativeLayout) findViewById(R.id.rlmanagemove);

        main = (RelativeLayout) findViewById(R.id.rlmain);

        add1 = (ImageButton) findViewById(R.id.bAddDish);

        roomButtons = (LinearLayout) findViewById(R.id.llButtonRooms);

        kitchen = (Button) findViewById(R.id.bKitchen);

        roomContent = (TextView) findViewById(R.id.tvRoomContent);

        itemValue = (TextView) findViewById(R.id.tvItemValue);

        addRooms = (LinearLayout) findViewById(R.id.llhsvLayout);
        addRooms.setOrientation(LinearLayout.HORIZONTAL);

        managemove.setOnClickListener(this);
        manageroom.setOnClickListener(this);
        add1.setOnClickListener(this);
        kitchen.setOnClickListener(this);

        Intent i = getIntent();     
        currentMove = i.getStringExtra("moveName");

    }

    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.bManageMove:
            merge.setVisibility(View.VISIBLE);
            main.setVisibility(View.INVISIBLE);
            check = 1;
            break;

        case R.id.bManageRooms:
            roomButtons.setVisibility(View.VISIBLE);
            main.setVisibility(View.INVISIBLE);
            //          LinearLayout laddbuttons = (LinearLayout) findViewById(R.id.llhsvLayout);
            //          laddbuttons.setOrientation(LinearLayout.HORIZONTAL);
            //
            //          for (int i = 0; i < 3; i++) {
            //              LinearLayout row = new LinearLayout(this);
            //              row.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
            //
            //              for (int j = 0; j < 4; j++) {
            //                  Button btnTag = new Button(this);
            //                  btnTag.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
            //                  btnTag.setText("Button " + (j + 1 + (i * 4)));
            //                  btnTag.setId(j + 1 + (i * 4));
            //                  row.addView(btnTag);
            //              }
            //
            //              laddbuttons.addView(row);
            //          }
            check = 2;
            break;

        case R.id.bAddDish:
            currentItem = currentItem + "\nDishwahser";
            currentItemValue = "" + itemval + "\n";
            itemval++;

            roomContent.setText(currentItem);
            itemValue.setText(currentItemValue);
            break;

        case R.id.bKitchen:
            LinearLayout row = new LinearLayout(this);
            row.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

            try {
                SQLHandler kitchen = new SQLHandler(StartMoving.this);
                currentRoom = "Kitchen" + inc;
                kitchen.open();
                String returnedRoom = kitchen.getRoom(currentRoom);

                while (notavailroom) {
                    if (returnedRoom.equals(currentRoom)) {
                        inc++;
                        returnedRoom = kitchen.getRoom(currentRoom);
                    }else{
                        notavailroom = false;
                        kitchen.addRooms(currentMove, currentRoom);
                        roomName.setText(currentRoom);
                        Button b = new Button(StartMoving.this);
                        b.setText(currentRoom);
                        row.addView(b);
                        b.setOnClickListener(new OnClickListener() {

                            public void onClick(View v) {
                                // TODO Auto-generated method stub

                            }
                        });
                        addRooms.addView(row);
                        main.setVisibility(View.VISIBLE);
                        roomButtons.setVisibility(View.INVISIBLE);
                    }
                }
                kitchen.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                SQLHandler kitchen = new SQLHandler(StartMoving.this);
                currentRoom = "Kitchen" + inc;
                kitchen.open();
                kitchen.addRooms(currentMove, currentRoom);
                roomName.setText(currentRoom);
                Button b = new Button(StartMoving.this);
                b.setText(currentRoom);
                row.addView(b);
                b.setOnClickListener(new OnClickListener() {

                    public void onClick(View v) {
                        // TODO Auto-generated method stub

                    }
                });
                addRooms.addView(row);
                main.setVisibility(View.VISIBLE);
                roomButtons.setVisibility(View.INVISIBLE);
                kitchen.close();
            }

            break;

        default:
            break;
        }
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        // TODO Auto-generated method stub
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onRestoreInstanceState(savedInstanceState);

        roomName.setText("Hello world");
    }

    public void onBackPressed(){
        super.onBackPressed();

    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
            // do something on back.
            if (check == 1) {
                merge.setVisibility(View.INVISIBLE);
                main.setVisibility(View.VISIBLE);
                check = 0;
            }else if (check == 2) {
                main.setVisibility(View.VISIBLE);
                roomButtons.setVisibility(View.INVISIBLE);
                check = 0;
            }else {
                //              this.finish();
                Intent i = new Intent(StartMoving.this, ListMovingNames.class);
                startActivity(i);
            }
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }
}

这个问题的罪魁祸首是这行代码

case R.id.bKitchen:
            LinearLayout row = new LinearLayout(this);
            row.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

            try {
                SQLHandler kitchen = new SQLHandler(StartMoving.this);
                currentRoom = "Kitchen" + inc;
                kitchen.open();
                String returnedRoom = kitchen.getRoom(currentRoom);

                while (notavailroom) {
                    if (returnedRoom.equals(currentRoom)) {
                        inc++;
                        returnedRoom = kitchen.getRoom(currentRoom);
                    }else{
                        notavailroom = false;
                        kitchen.addRooms(currentMove, currentRoom);
                        roomName.setText(currentRoom);
                        Button b = new Button(StartMoving.this);
                        b.setText(currentRoom);
                        row.addView(b);
                        b.setOnClickListener(new OnClickListener() {

                            public void onClick(View v) {
                                // TODO Auto-generated method stub

                            }
                        });
                        addRooms.addView(row);
                        main.setVisibility(View.VISIBLE);
                        roomButtons.setVisibility(View.INVISIBLE);
                    }
                }
                kitchen.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                SQLHandler kitchen = new SQLHandler(StartMoving.this);
                currentRoom = "Kitchen" + inc;
                kitchen.open();
                kitchen.addRooms(currentMove, currentRoom);
                roomName.setText(currentRoom);
                Button b = new Button(StartMoving.this);
                b.setText(currentRoom);
                row.addView(b);
                b.setOnClickListener(new OnClickListener() {

                    public void onClick(View v) {
                        // TODO Auto-generated method stub

                    }
                });
                addRooms.addView(row);
                main.setVisibility(View.VISIBLE);
                roomButtons.setVisibility(View.INVISIBLE);
                kitchen.close();
            }

            break;

我基本上想要做的是当kitchen button按下它时首先检查数据库是否存在从数据库中为该按钮提供的文本,如果没有则为该按钮提供默认名称并保存到数据库但如果名称确实存在,则会通过递增int inc来命名currentRoom = "kitchen " + inc;

来提供其他名称

这里也是用于处理数据库的SQLHandler.java

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class SQLHandler {
    public static final String KEY_ROOMMOVEHOLDER = "roommoveholder";
    public static final String KEY_ROOM = "room";

    public static final String KEY_ITEMMOVEHOLDER = "itemmoveholder";
    public static final String KEY_ITEMNAME = "itemname";
    public static final String KEY_ITEMVALUE = "itemvalue";
    public static final String KEY_ROOMHOLDER = "roomholder";

    public static final String KEY_MOVENAME = "movename";
    public static final String KEY_ID1 = "_id";
    public static final String KEY_ID2 = "_id";
    public static final String KEY_ID3 = "_id";
    public static final String KEY_ID4 = "_id";
    public static final String KEY_MOVEDATE = "movedate";

    private static final String DATABASE_NAME = "mymovingfriend";
    private static final int DATABASE_VERSION = 1;

    public static final String KEY_TODOMOVE = "todomove";
    public static final String KEY_SORTANDPURGE = "sortandpurge";
    public static final String KEY_RESEARCH = "research";
    public static final String KEY_CREATEMOVINGBINDER = "createmovingbinder";
    public static final String KEY_ORDERSUPPLIES = "ordersupplies";
    public static final String KEY_USEITORLOSEIT = "useitorloseit";
    public static final String KEY_TAKEMEASUREMENTS = "takemeasurements";
    public static final String KEY_CHOOSEMOVER = "choosemover";
    public static final String KEY_BEGINPACKING = "beginpacking";
    public static final String KEY_LABEL = "label";
    public static final String KEY_SEPARATEVALUES = "separatevalues";
    public static final String KEY_DOACHANGEOFADDRESS = "doachangeofaddress";
    public static final String KEY_NOTIFYIMPORTANTPARTIES = "notifyimportantparties";

    private static final String DATABASE_TABLE1 = "movingname";
    private static final String DATABASE_TABLE2 = "movingrooms";
    private static final String DATABASE_TABLE3 = "movingitems";
    private static final String DATABASE_TABLE4 = "todolist";

    public static final String CREATE_TABLE_1 = "CREATE TABLE " + DATABASE_TABLE1 + " (" + 
            KEY_ID1 + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
            KEY_MOVEDATE + " TEXT NOT NULL, " + 
            KEY_MOVENAME + " TEXT NOT NULL);";

    public static final String CREATE_TABLE_2 = "CREATE TABLE " + DATABASE_TABLE2 + " (" + 
            KEY_ID2 + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
            KEY_ROOMMOVEHOLDER + " TEXT NOT NULL, " + 
            KEY_ROOM + " TEXT NOT NULL);";

    public static final String CREATE_TABLE_3 = "CREATE TABLE " + DATABASE_TABLE3 + " (" + 
            KEY_ID3 + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
            KEY_ITEMNAME + " TEXT NOT NULL, " + 
            KEY_ITEMVALUE + " TEXT NOT NULL, " +
            KEY_ROOMHOLDER + " TEXT NOT NULL, " +   
            KEY_ITEMMOVEHOLDER + " TEXT NOT NULL);";

    public static final String CREATE_TABLE_4 = "CREATE TABLE " + DATABASE_TABLE4 + " (" + 
            KEY_ID4 + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
            KEY_TODOMOVE + " TEXT NOT NULL, " +
            KEY_SORTANDPURGE + " TEXT NOT NULL, " + 
            KEY_RESEARCH + " INTEGER NOT NULL, " +
            KEY_CREATEMOVINGBINDER + " TEXT NOT NULL, " + 
            KEY_ORDERSUPPLIES + " TEXT NOT NULL, " +
            KEY_USEITORLOSEIT + " TEXT NOT NULL, " + 
            KEY_TAKEMEASUREMENTS + " TEXT NOT NULL, " +
            KEY_CHOOSEMOVER + " TEXT NOT NULL, " + 
            KEY_BEGINPACKING + " TEXT NOT NULL, " +
            KEY_LABEL + " TEXT NOT NULL, " + 
            KEY_SEPARATEVALUES + " TEXT NOT NULL, " +
            KEY_DOACHANGEOFADDRESS + " TEXT NOT NULL, " + 
            KEY_NOTIFYIMPORTANTPARTIES + " TEXT NOT NULL);";

    private DbHelper ourHelper;
    private final Context ourContext;
    private SQLiteDatabase ourDatabase;

    private static class DbHelper extends SQLiteOpenHelper{

        public DbHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(CREATE_TABLE_1);
            db.execSQL(CREATE_TABLE_2);
            db.execSQL(CREATE_TABLE_3);
            db.execSQL(CREATE_TABLE_4);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
            // TODO Auto-generated method stub
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE1);
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE2);
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE3);
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE4);
            onCreate(db);
        }
    }

    public SQLHandler(Context c){
        ourContext = c;
    }

    public SQLHandler open() throws SQLException{
        ourHelper = new DbHelper(ourContext);
        ourDatabase = ourHelper.getWritableDatabase();
        return this;
    }

    public void close(){
        ourHelper.close();
    }

    public long createMove(String smovename){
        ContentValues cv = new ContentValues();
        cv.put(KEY_MOVENAME, smovename);
        cv.put(KEY_MOVEDATE, "Not yet set");
        return ourDatabase.insert(DATABASE_TABLE1, null, cv);
    }

    public long addRooms(String sroommoveholder, String sroom){
        ContentValues cv = new ContentValues();
        cv.put(KEY_ROOMMOVEHOLDER, sroommoveholder);
        cv.put(KEY_ROOM, sroom);
        return ourDatabase.insert(DATABASE_TABLE2, null, cv);
    }

    public long addItems(String sitemmoveholder, String sroomholder, String sitemname, String sitemvalue){
        ContentValues cv = new ContentValues();
        cv.put(KEY_ITEMMOVEHOLDER, sitemmoveholder);
        cv.put(KEY_ROOMHOLDER, sroomholder);
        cv.put(KEY_ITEMNAME, sitemname);
        cv.put(KEY_ITEMVALUE, sitemvalue);
        return ourDatabase.insert(DATABASE_TABLE3, null, cv);
    }

    public long todoList(String todoitem){
        ContentValues cv = new ContentValues();
        cv.put(todoitem, "Done");
        return ourDatabase.insert(DATABASE_TABLE4, null, cv);
    }

    public Cursor getMove(){
        String[] columns = new String[]{KEY_ID1, KEY_MOVENAME};
        Cursor cursor = ourDatabase.query(DATABASE_TABLE1, columns, null, null, null, null, null);
        return cursor;
    }

    public String getRoom(String r) throws SQLException{
        String[] columns = new String[]{KEY_ID2, KEY_ROOMMOVEHOLDER, KEY_ROOM};
        Cursor c = ourDatabase.query(DATABASE_TABLE2, columns, KEY_ROOM + "= '" + r + "'" , null, null, null, null);

        if (c != null) {
            c.moveToFirst();
            String roomName = c.getString(2);
            return roomName;
        }
        return null;

    }

}

2 个答案:

答案 0 :(得分:1)

因为这句话,我觉得这是一个不变的循环:

if (returnedRoom.equals(currentRoom)) {
    inc++;
    returnedRoom = kitchen.getRoom(currentRoom);
}

不会返回的房间总是等于currentRoom吗? (仅仅因为currentRoom永远不会改变。)

即使你正在增加inc,它也不会改变currentRoom。

我认为应该是

if (returnedRoom.equals(currentRoom)) {
    currentRoom = "Kitchen" + ++inc;
    returnedRoom = kitchen.getRoom(currentRoom);
}

答案 1 :(得分:0)

来自 SQLiteOpenHelper 文档:

  

此类使ContentProvider实现更容易推迟   打开和升级数据库直到第一次使用,以避免阻塞   应用程序启动与长期运行的数据库升级。

getReadableDatabase getWritableDatabase 的文档中:

  

数据库升级可能需要很长时间,您不应该调用此方法   从应用程序主线程,包括来自   ContentProvider.onCreate()。