2010-10-17 99 views
0

我最近嘗試創建一個在第二個線程中打開ProgressDialog的簡單方法,因此如果主線程凍結對話框將繼續工作。Android 2.2:ProgressDialog在第二個線程中凍結

這裏是類: public class ProgressDialogThread extends Thread public Looper ThreadLooper; public Handler mHandler;

public ProgressDialog ThreadDialog; public Context DialogContext; public String DialogTitle; public String DialogMessage;

public ProgressDialogThread(Context mContext, String mTitle, String mMessage) 
{ 
    DialogContext = mContext; 
    DialogTitle = mTitle; 
    DialogMessage = mMessage; 
} 

public void run() 
{ 
    Looper.prepare(); 
    ThreadLooper = Looper.myLooper(); 

    ThreadDialog = new ProgressDialog(DialogContext); 
    ThreadDialog.setTitle(DialogTitle); 
    ThreadDialog.setMessage(DialogMessage); 
    ThreadDialog.show(); 

    mHandler = new Handler(); 

    Looper.loop(); 
} 

public void Update(final String mTitle, final String mMessage) 
{ 
    while(mHandler == null) 
    synchronized(this) { 
    try { wait(10); } 
    catch (InterruptedException e) { 
    Log.d("Exception(ProgressDialogThread.Update)", e.getMessage() == null ? "MISSING MESSAGE" : e.getMessage()); 
    } 
    } 

    mHandler.post(new Runnable(){ 
    @Override 
    public void run() { 
    ThreadDialog.setTitle(mTitle); 
    ThreadDialog.setMessage(mMessage); 
    }}); 
} 

public void Dismiss() 
{ 
    while(ThreadDialog == null || mHandler == null) 
    synchronized(this) { 
    try { wait(10); } 
    catch (InterruptedException e) { 
    Log.d("Exception(ProgressDialogThread.Dismiss)", e.getMessage() == null ? "MISSING MESSAGE" : e.getMessage()); 
    } 
    } 

    mHandler.post(new Runnable(){ 
    @Override 
    public void run() { 
    ThreadDialog.dismiss(); 
    }}); 
} 

public void Continue() 
{ 
    while(ThreadLooper == null || mHandler == null) 
    synchronized(this) { 
    try { wait(10); } 
    catch (InterruptedException e) { 
    Log.d("Exception(ProgressDialogThread.Continue)", e.getMessage() == null ? "MISSING MESSAGE" : e.getMessage()); 
    } 
    } 

    mHandler.post(new Runnable(){ 
    @Override 
    public void run() { 
    ThreadLooper.quit(); 
    }}); 
} 

然而,它有時可以很好地工作,但有時應用程序最終會凍結並崩潰。

下面是使用的例子:

ProgressDialogThread thread = new ProgressDialogThread(this, "Loading", "Please wait..."); 
thread.start(); 
// Do Stuff 
thread.Dismiss(); 
thread.Continue(); 

它會產生大量的警告,有時甚至有些崩潰:

如。 處理程序:發送郵件到死絲....

和例外像 ANR ...... 原因:keyDispatchingTimedOut

感謝您的幫助, 亞歷克斯。

回答

0

當你想在Android的獨立線程中做東西時,你應該看看AsyncTask類。你可以在這裏讀到它:http://developer.android.com/resources/articles/painless-threading.html

谷歌搜索(還是在這裏堆棧溢出搜索)也將提供給你大量關於如何使用它,它上面的鏈接信息是不夠的:)

+0

感謝您的答覆,但是我已經讀了幾篇文章= P,但是我無法從中得到一些處理多種情況的方法,在這種情況下需要使用單個解決方案進行線程化。我嘗試過的其他方式似乎需要通過多個文件傳播相當數量的代碼。 – 2010-10-20 11:30:02

+0

@Alex:我不確定我是否理解你的問題。有關如何使用'AsyncTask'顯示'ProgressDialog'的簡單示例,請參閱此鏈接:http://pastebin.com/tLDYhtj3(附加註釋描述正在發生的事情)。如果你能解釋*爲什麼*這在你的情況下不起作用,我們可能能夠進一步幫助你。 – Nailuj 2010-10-20 11:46:02