0

这家伙一直在让我的应用程序冻结,有什么方法可以解决这个问题?

这是我的代码:

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;

    }

}
4

2 回答 2

1

由于以下语句,在我看来这是一个持续循环:

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

不returnRoom 总是等于currentRoom 吗?(仅仅是因为 currentRoom 永远不会改变。)

即使您增加 inc,它也不会改变 currentRoom。

我认为应该是

if (returnedRoom.equals(currentRoom)) {
    currentRoom = "Kitchen" + ++inc;
    returnedRoom = kitchen.getRoom(currentRoom);
}
于 2012-09-24T04:04:42.273 回答
0

来自SQLiteOpenHelper文档:

此类使 ContentProvider 实现可以轻松地将数据库的打开和升级推迟到第一次使用,以避免因长时间运行的数据库升级而阻塞应用程序启动。

在getReadableDatabasegetWritableDatabase的文档下:

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

于 2012-09-24T04:10:37.733 回答