2013-09-25 49 views
2

當用戶點擊一個活動中的按鈕時,我需要處理一些數據,所以屏幕看起來像應用程序停止2-3秒。這不是很多,但我想給用戶提供一切正常的信息,IMO最好的辦法就是進度條,只有在處理數據時才能看到進度條。ProgressBar的可見性

我發現進度的代碼,它看起來像這樣:

<ProgressBar 
    android:id="@+id/loadingdata_progress" 
    style="?android:attr/progressBarStyle" 
    android:layout_width="50dp" 
    android:layout_height="50dp" 
    android:layout_alignBottom="@+id/fin2_note" 
    android:layout_centerHorizontal="true" 
    android:indeterminate="true" 
    android:visibility="invisible" /> 

和插在我的佈局中。

,並試圖如果進度的作品,我把這段代碼

loadingimage= (ProgressBar) findViewById(R.id.loadingdata_progress); loadingimage.setVisibility(View.VISIBLE);

onCreate方法,一切都看起來很好。 然後我重新創建代碼來顯示此進度條只有在數據處理。

點擊之後,用戶調用此方法

public void fin2_clickOnFinalization(View v) 
    {  

      loadingimage= (ProgressBar) findViewById(R.id.loadingdata_progress); 
    loadingimage.setVisibility(View.VISIBLE); 

      // code where data is processing 
      loadingimage.setVisibility(View.INVISIBLE); 
     } 

並沒有什麼出現在屏幕上。我不知道錯誤在哪裏。如果我通過id找到了進度條,我很奇怪我可以在onCreate方法中控制它,但在onclick方法中,它超出了我的控制範圍。

+0

請粘貼您的完整的XML文件,其中進度編碼 –

+0

我不t認爲錯誤是在xml文件,因爲當進度條被設置爲onCreate中可見時,一切工作 – MyWay

回答

5

你的UI線程不能顯示進度條的原因是忙碌由於你的數據處理。嘗試使用這種代碼:

public void fin2_clickOnFinalization(View v) { 

    new YourAsyncTask().execute(); 
} 

private class YourAsyncTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... args) { 
     // code where data is processing 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) {   
     loadingimage.setVisibility(View.INVISIBLE); 
     super.onPostExecute(result); 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     loadingimage.setVisibility(View.VISIBLE); 
    } 
} 

編輯:

的AsyncTask讓你運行在單獨的線程代碼,使應用更加敏感,只是把耗時代碼中doInBackground

3

您沒有給UI刷新時間。您的「數據處理」代碼正在UI線程上運行,阻止任何可見的更改。在系統控制刷新顯示時,您已經將其設置爲隱形。

要解決此問題,請將處理代碼移至單獨的線程或AsyncTask。然後,您可以將進度欄設置爲可見,啓動任務,並在完成後將其自動隱藏。

爲了達到此目的,我推薦在Android上使用AsyncTask,因爲它帶有有用的回調函數。開發人員指南(在上面鏈接的Javadoc中)非常明確,並概述了您需要採取的所有步驟。

+0

thx這篇文章,我尋找鏈接,它可以幫助我創建我自己的類; – MyWay

1

您可以嘗試在佈局,但在你的活動而不是創建一個全局ProgressDialog:

public class MyActivity { 

ProgressDialog progress = null; 

protected void onCreate(...) { 
    progressDialog = new ProgressDialog(this); 
    progressDialog.setCancelable(false); 
    progressDialog.setTitle("Progress"); 
} 

public void fin2_clickOnFinalization(View v) 
{  
    progress.show(); 
    // code where data is processing 
    progress.dismiss(); 
} 

} 

希望我可以幫助

+0

如果用戶關數據處理過程中的活動?我認爲創建和解散對話框應該在檢查活動是否在前臺之後完成,否則如果活動不存在則它將通過IllegalArgumentException或BadTokenException – rd7773

1

對於這樣的任務,AsyncTask的權重過大。

一個好得多的解決方案

Handler handler = new Handler(getMainLooper()); 
handler.post(new Runnable() { 
    @Override 
    public void run() { 
     loadingimage.setVisibility(View.VISIBLE); 
    } 
}); 

或者更簡單的(確實基本上與上述方案同樣的事情)

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     loadingimage.setVisibility(View.VISIBLE); 
    } 
});