2011-03-21 113 views
1

我在應用程序的背景中有一個線程解析XML。就像這樣,它通過Handler更新活動視圖中的進度條。這可以正常工作,直到手機改變方向(並且可能在其他破壞性操作期間,例如多任務處理,儘管我沒有經過全面測試)。進行任意數量的旋轉後,進度條會凍結它的位置並且永遠不會前進,即使解析完成並且我的ListView自身更新也很好。線程處理程序停止處理方向更改

下面是相關代碼的簡化版本。我沒有在這裏包括它,但我確實有代碼來確保線程在旋轉之後繼續不受阻礙 - 就像我所說的那樣,解析最終會在相同的時間內完成並更新ListView。這只是進度條處理程序不工作:

private ProgressBar mProgress; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.directory_list); 
    mProgress = (ProgressBar) findViewById(R.id.progressBar); 
    mProgress.setMax(entryCount); 
    startXMLParseThread(); 
} 

private void startXMLParseThread() { 
    new Thread() { 
      Handler hUpdateProgressBar = new Handler(){ 
        public void handleMessage(Message msg) { 
      mProgress.setProgress(entryCount); 
        } 
      }; 

      public void run() { 
        while (parserEvent != XmlPullParser.END_DOCUMENT) { 
          entryCount++; 
          hUpdateProgressBar.sendEmptyMessage(0); 
          parserEvent = parser.next(); 
        } 

        mHandler.post(new Runnable() { 
          public void run() { 
             adapter.getCursor().requery(); 
          } 
       }); 
      } 
    }.start();  
} 
+0

請參閱http://stackoverflow.com/questions/1111980/how-to-handle-screen-orientation-change-when-progress-dialog-and-background-threa和http://stackoverflow.com/questions/3821423/background-task-progress-dialog-orientation-change-is - 任何100個工作 – bigstones 2011-03-21 20:12:25

回答

1

可能是其再次運行onCreate方法與方向的變化......所以它失去參考以往處理......試試這個..add屬性該特定活動中的清單文件android:configChanges =「orientation」...以這種方式,它不會再運行onCreate ...給它一個鏡頭...

+0

感謝您的建議。我已經嘗試過了,但我再次嘗試過,但不幸的是沒有任何變化。酒吧仍然卡住。編輯:啊,等等!我把它放在清單中的錯誤位置。把它放在'活動'之後,它現在就像我想要的那樣工作。謝謝! 不過,我希望我不會因爲不採用「Android方式」做事而陷入困境。 Google建議不要重新創建視圖方向更改?或者只有當您針對不同的方向使用不同的佈局時才適用? – LouieGeetoo 2011-03-21 20:53:41

+1

是的,他們這樣做。如果您確實知道正確處理方向更改,則只應使用此方法。一種不同的方式是將自己的引用傳遞給'onRetainNonConfigurationInstance'中的'Thread',然後使用'getLastNonConfigurationInstance'獲取'onCreate'中的引用,並檢查它是否爲空(在這種情況下,現有任務將運行不會啓動一個)。你確實想在每次調用'onCreate'的時候設置處理器,儘管在你的線程中添加了一個'setHandler'方法並且替換了現有的處理器。 – 2011-03-21 21:26:44

+0

它似乎按原樣工作,但如果遇到任何麻煩,我會回來試試你的建議。非常感謝您提供的信息豐富的評論! – LouieGeetoo 2011-03-23 02:51:24