2012-09-24 49 views
0

這個人不斷踢我的應用程序凍結,任何方法來解決這個問題?GC_CONCURRENT問題

這裏是我的代碼:

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;

這裏也用於處理數據庫

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; 

    } 

} 

回答

1

的SQLHandler.java看起來對我來說,這是因爲這句話的恆定循環:

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

豈不returnedRoom總是等於currentRoom ? (因爲currentRoom從不改變。)

即使您正在增加inc,它也不會更改currentRoom。

我覺得應該是

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

謝謝先生! :) – philip

0

SQLiteOpenHelper文檔:

這個類很容易讓ContentProvider的實現推遲 開啓和升級數據庫,直到第一次使用,以避免阻止 應用程序啓動時長期運行的數據庫升級。

文檔在getReadableDatabasegetWritableDatabase

數據庫升級可能需要很長的時間,你不應該從應用程序的主線程中調用這個方法 ,包括 的ContentProvider。的onCreate()。