我有一個進度對話框,我用於我的程序中的一部分,我在後臺進行時間密集型操作,但是當對話框顯示時,UI或微調器圖標凍結/慢/猶豫該程序看起來好像凍結了。在我的AsyncTask
的onPostExecute
中,我忽略了該對話框。進度對話框用戶界面凍結/慢
爲什麼會發生這種情況,因爲我在後臺完成所有工作?
這裏是我的代碼
pDialog = ProgressDialog.show(FullGame.this,"Starting New Game","Please Wait...", true);
new StartNewGame().execute();
private class StartNewGame extends AsyncTask<Void,Void,Boolean>{
@Override
protected Boolean doInBackground(Void... params) {
try{
ContentValues values = new ContentValues();
Cursor c = getContentResolver().query(Games.PART1_URI,new String[] {Games.PART1_NUM},
Games.PART1_GAME_ID+"="+gameID+" AND "+Games.PART1_FRAME_NUM+"="+10,null,null);
c.moveToFirst();
String num = c.getString(0);
int part1 =0;
if(num.equals("-")){
part1=0;
}else{
part1=Integer.parseInt(num);
}
c = getContentResolver().query(Games.PART2_URI,new String[] {Games.PART2_NUM},
Games.PART2_GAME_ID+"="+gameID+" AND "+Games.PART2_FRAME_NUM+"="+10,null,null);
c.moveToFirst();
int part2 = 0;
if(num.equals("-")){
part2=0;
}else{
part2=Integer.parseInt(num);
}
c = getContentResolver().query(Games.PART3_URI,new String[] {Games.PART3_NUM},
Games.PART3_GAME_ID+"="+gameID,null,null);
c.moveToFirst();
int part3 = 0;
if(num.equals("-")){
part3=0;
}else{
part3=Integer.parseInt(num);
}
if(part1 == 10){
values.clear();
values.put(Games.STRIKES_FRAME_NUM,10);
values.put(Games.STRIKES_BOWLER_ID,bowlerClickedID);
values.put(Games.STRIKES_GAME_ID,gameID);
getContentResolver().insert(Games.STRIKES_URI, values);
}
if(part2 == 10){
values.clear();
values.put(Games.STRIKES_FRAME_NUM,10);
values.put(Games.STRIKES_BOWLER_ID,bowlerClickedID);
values.put(Games.STRIKES_GAME_ID,gameID);
getContentResolver().insert(Games.STRIKES_URI, values);
}
if(((part2+part3) == 10) && !score.checkSpare(10)){
values.clear();
values.put(Games.SPARES_BOWLER_ID,bowlerClickedID);
values.put(Games.SPARES_FRAME_NUM,10);
values.put(Games.SPARES_GAME_ID,gameID);
getContentResolver().insert(Games.SPARES_URI, values);
}
if(part3 == 10){
values.clear();
values.put(Games.STRIKES_FRAME_NUM,10);
values.put(Games.STRIKES_BOWLER_ID,bowlerClickedID);
values.put(Games.STRIKES_GAME_ID,gameID);
getContentResolver().insert(Games.STRIKES_URI, values);
}
c.close();
}catch(Exception e){
Log.d("FullGame",e.toString());
}
Date date = new Date(System.currentTimeMillis());
DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
String newDate = df.format(date);
ContentValues values = new ContentValues();
values.put(Games.GAMES_BOWLER_ID,bowlerClickedID);
values.put(Games.GAMES_TEAM_ID,1);
values.put(Games.GAMES_DATE,newDate);
values.put(Games.GAME_SEASON, pref.getLong(Preferences.SELECTED_SEASON, 1));
values.put(Games.GAMES_TOURNAMENT_ID, tournamentID);
Uri uri = getContentResolver().insert(Games.GAMES_URI, values);
gameID = ContentUris.parseId(uri);
int gameid = Integer.valueOf(String.valueOf(gameID));
values.clear();
Cursor cName = getContentResolver().query(BowlersDB.CONTENT_URI,new String[] {BowlersDB.FIRST_NAME},BowlersDB.ID+"="+bowlerClickedID,null,null);
cName.moveToFirst();
String name = cName.getString(0);
for(int i = 0;i<10;i++){
int num = i+1;
values.put(Games.NAMES_FRAME_NUM,num);
values.put(Games.NAMES_GAME_ID,gameid);
values.put(Games.NAMES_NAME,name);
getContentResolver().insert(Games.NAMES_URI, values);
names(i,name);
values.clear();
values.put(Games.PART1_FRAME_NUM,num);
values.put(Games.PART1_NUM,"0");
values.put(Games.PART1_GAME_ID,gameid);
getContentResolver().insert(Games.PART1_URI, values);
values.clear();
values.put(Games.PART2_FRAME_NUM,num);
values.put(Games.PART2_NUM,"0");
values.put(Games.PART2_GAME_ID,gameid);
getContentResolver().insert(Games.PART2_URI, values);
values.clear();
values.put(Games.TOTALS_FRAME_NUM,num);
values.put(Games.TOTALS_FRAME_TOTAL,"0");
values.put(Games.TOTALS_GAME_ID,gameid);
getContentResolver().insert(Games.TOTALS_URI, values);
values.clear();
values.put(Games.POCKETS_BOWLER_ID,bowlerClickedID);
values.put(Games.POCKETS_FRAME_NUM,i);
values.put(Games.POCKETS_GAME_ID,gameID);
values.put(Games.POCKETS_TEAM_ID, teamSelectedID);
values.put(Games.POCKETS_TOURNAMENT_ID, tournamentID);
values.put(Games.POCKETS_NUM, 0);
values.put(Games.POCKETS_SEASON, pref.getLong(Preferences.SELECTED_SEASON, 1));
getContentResolver().insert(Games.POCKETS_URI, values);
values.clear();
}
values.put(Games.PART3_GAME_ID,gameid);
values.put(Games.PART3_NUM,"0");
getContentResolver().insert(Games.PART3_URI, values);
cName.close();
part1Array = new int[10];
part2Array = new int[10];
totalsArray = new int[10];
part3 = 0;
mPinsUp = new ArrayList<Long>();
mPinsUp.add((long) 1);
mPinsUp.add((long) 2);
mPinsUp.add((long) 3);
mPinsUp.add((long) 4);
mPinsUp.add((long) 5);
mPinsUp.add((long) 6);
mPinsUp.add((long) 7);
mPinsUp.add((long) 8);
mPinsUp.add((long) 9);
mPinsUp.add((long) 10);
return true;
}
protected void onPostExecute(Boolean result){
pDialog.dismiss();
}
}
UPDATE: 通過昨晚在調試模式下的代碼,它似乎開始做它在for循環,但仍所有這一切都在一個單獨的完成運行線程,我只是值插入我的數據庫
更新2 如果我註釋掉for循環的進度對話框被顯示不到一秒鐘,這樣即使我在做的一切AsyncTask
插入必須仍然在UI線程中運行
你在做這在主線程或ui線程上。還有關於這個的其他話題,也許他們會幫助。 HTTP://計算器。com/questions/3652560/what-is-android-uithread-ui-thread – 2012-08-13 13:12:16
以及你可以看到它是一個AsyncTask,所以它會在另一個線程 – tyczj 2012-08-13 14:50:55
你的'onPreExecute'部分在哪裏?你也可以將'doInBackground'中的所有代碼放入一個方法中,因爲它應該全部在新線程中執行,並使所有這些更容易閱讀。您還測試了哪些硬件? – 2012-08-13 15:00:47