編輯:已解決。對不起,我發現,雖然我的數據加載發生在後臺線程中,但解析數據的回調不是。數據的解析需要很長時間,這就是鎖定我的線程。ASynchTask睡在doinbackground鎖定UI線程
編輯:它已經引起我的注意,我的首要問題(ProgressDialog不再旋轉)可能是由我使用ProgressDialog而不是UI線程被阻止的問題引起的。如果是這樣的話,我該如何解決這個問題?
編輯:澄清,這並沒有永遠鎖定整個程序。一旦加載了所有內容,進度對話框將被解除,並且新的活動將被啓動。我的問題是,雖然它加載,整個UI鎖起來(即progressdialog停止旋轉)
TL; DR:Thread.sleep()方法在doInBackground()被鎖定在UI線程
我有一個應用程序,當某個特定活動打開時,開始從我的後端加載後臺的大量數據,例如與計劃相關的大量數據。這些信息不會馬上使用,但可以在用戶嘗試訪問它時使用(即通過點擊計劃按鈕並啓動計劃活動)。
如果用戶在點擊計劃按鈕之前等待了一下,所有數據加載,計劃活動打開,並顯示一切都很好。我的問題是如果他們在數據加載之前點擊按鈕。
我在這裏的解決方案是創建一個ASyncTask,它顯示ProgressDialog,同時定期檢查數據是否已完成加載,否則將進入休眠狀態。它知道數據是通過一些應用程序範圍的布爾變量完成加載的。我的問題是,即使Thread.sleep()在doinbackground()中運行,它仍然鎖定UI線程。
我使用的是自定義的AsyncTask,定義如下:
public class LoadWithProgressDialog extends AsyncTask<Void, Void, Boolean>{
private ProgressDialog pd; //the progress dialog
private String title; //the title of the progress dialog
private String message; //the body of the progress dialog
private Runnable task; //contains the code we want to run in the background
private Runnable postTask; //execute when the task ends
private Context c;
public LoadWithProgressDialog(Context context,String t, String m,Runnable r, Runnable postR){
super();
c = context;
task = r;
postTask = postR;
title = t;
message = m;
}
@Override
protected void onPreExecute(){
pd = ProgressDialog.show(c,title, message, false, false);
}
@Override
protected Boolean doInBackground(Void... params) {
task.run();
return true;
}
@Override
protected void onPostExecute(Boolean result) {
pd.dismiss();
if(postTask != null)
postTask.run();
}
和經由(例如)調用它:
if(loadingSchedule){
LoadWithProgressDialog lwpd = new LoadWithProgressDialog(thisClass,"Loading","Loading Schedule", new Runnable() {
public void run(){
while(loadingSchedule){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
},new Runnable() {
public void run(){
Intent i= new Intent(thisClass, Schedule.class);
i.putExtra("numberIneed",index);
startActivity(i);
}
});
lwpd.execute();
(I縮短到訪問全局變量設置爲 「loadingSchedule」使其更容易閱讀)
如何使這不鎖定UI線程?
對不起,請參閱我的編輯澄清。一旦完成後臺加載,所有事情都會再次運行。它只是鎖定了持續時間(ProgressDialog不旋轉)。我不知道如何識別UI鎖定的時間,因爲除了應該保持progressdialog旋轉(我沒有寫入)之外,沒有任何代碼在運行。 – 2012-02-15 00:19:11