2014-03-26 147 views
1

我一直在試圖讓數據被檢索時進度對話框工作。AsyncTask progressdialog不顯示,doInBackground阻止UI

我用這個鏈接Implement android splash screen while loading data讓我開始,但似乎我無法讓它正常工作。

到目前爲止,它沒有顯示任何進度條,因爲我認爲funcion fillMyTickets阻塞UI線程,因此對話框不顯示。我不明白如何解決這個問題。通過閱讀Stackoverflow,我發現瞭解決方案,比如在AsyncTask中使用onProgressUpdate函數,但那不是我想要的。我需要的是一個等待的對話框,表示在HTTP呼叫結束時下載並消失。

的AsyncTask功能exampleFragment.java

private ProgressDialog dialog; 
private class PrefetchData extends AsyncTask<Void, Void, Void> { 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    dialog = new ProgressDialog(getActivity()); 
    dialog.setMessage("Downloading.."); 
    dialog.setIndeterminate(true); 
    dialog.setCancelable(true); 
    dialog.show(); 
} 

@Override 
protected Void doInBackground(Void... arg0) { 
    fillMyTickets(); 
    return null; 
} 

@Override 
protected void onPostExecute(Void result) { 
    super.onPostExecute(result); 
    dialog.dismiss(); 
} 

fillMyTickets功能exampleFragment.java

private void fillMyTickets() { 
     HttpReader httpReader = new HttpReader(); 
     httpReader 
       .setOnResultReadyListener(new HttpReader.OnResultReadyListener() { 
        @Override 
        public void resultReady(String result) { 

         JsonHelper jsonHelper = new JsonHelper(); 
         tickets = jsonHelper.getTickets(result); 
        } 
       }); 
     httpReader 
       .execute(url); 
    } 

onAttach(活動性)其中執行的AsyncTask功能

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    new PrefetchData().execute(); 
} 

而且在評論dialog.dismiss() onPostExecute的AsyncTask時對話框不顯示,但然後ofcourse永遠不會關閉。

+1

你能展示你如何執行任務嗎? – codeMagic

+0

確保你在UI線程上調用'new PrefetchData()。execute()'(也許在你的''onClick''處理程序中,然後你應該擁有你想要的。) – kiruwka

+0

它必須自動加載。 – Niels

回答

1

您正在調用註冊偵聽器並下載某些數據的方法,但在下載數據之前,從doInBackground和解散對話框,所以你的對話框正在顯示和隱藏。嘗試修改代碼並在完成下載時關閉對話框:

private ProgressDialog dialog; 
private class PrefetchData extends AsyncTask<Void, Void, Void> { 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
    dialog = new ProgressDialog(getActivity()); 
    dialog.setMessage("Downloading.."); 
    dialog.setIndeterminate(true); 
    dialog.setCancelable(true); 
    dialog.show(); 
} 

@Override 
protected Void doInBackground(Void... arg0) { 
    HttpReader httpReader = new HttpReader(); 
    httpReader.setOnResultReadyListener(new HttpReader.OnResultReadyListener() { 
       @Override 
       public void resultReady(String result) { 
        JsonHelper jsonHelper = new JsonHelper(); 
        tickets = jsonHelper.getTickets(result); 
        //finished the download and we dismiss the dialog 
        dialog.dismiss(); 
       } 
      }); 
    httpReader.execute(url); 
    return null; 
} 

@Override 
protected void onPostExecute(Void result) { 
    super.onPostExecute(result); 
} 

希望它有幫助!

+0

doInBackground(Void ... arg0)出現錯誤,'此方法必須返回類型爲空的結果' – Niels

+0

我更新了我的答案,現在就試試。 – Giacomoni

0

好吧,所以我誤解了這個問題....但doinbackground不應該阻止任何這就是爲什麼它在後臺。

沒有那個答案....對話不是在UI上進行的。只需從常規活動而不是異步任務中運行即可。我jused使用烏爾男女同校的這個樣子,和美麗的

public class MainActivity extends Activity { 
    private ProgressDialog dialog; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     dialog = new ProgressDialog(this); 
      dialog.setMessage("Downloading.."); 
      dialog.setIndeterminate(true); 
      dialog.setCancelable(true); 
      dialog.show(); 
     } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

所以basicly移動對話框本身出的AsyncTask,並使用「這個」作爲背景。你可以從你的應用程序的任何地方啓動或殺死它,如果你將訪問權限從私有公開改爲公開,你將沒有任何問題

+0

我不是想爲了使飛濺屏幕工作,我只使用了指南的最後部分,我試圖顯示一個對話框,當票據被下載並被放入一個列表視圖中時,當使用上面的代碼時,對話框也不會顯示。這就是爲什麼我認爲用戶界面被阻止,因爲在doInBackground之前和之後正在打開和關閉對話框。 – Niels

+0

''在'UI線程'上顯示'Dialog' * *,因爲它在'onPreExecute()'中顯示, *運行在UI線程上 – codeMagic

+0

是的,但是id dosnt必須嚴格地說...我不是bieng爭論性的......只是說你可以通過在異步中保留獲取來實現你想要的,並將對話移動到主要活動你認爲它是一個花式吐司,你不需要對話的異步任務 – La5t5tarfighter

1

雖然我會建議您使用Volley庫來做異步網絡請求(包括重試策略,線程池執行器的東西,以及其他一些可以擴展和修改的美味東西),但在過去的項目中在進度對話框中使用了一個異步任務,並且之前已經遇到了這個問題。我處理它的方式是在您的類中編寫一個回調接口,以擴展將在postExecute()上調用的AsyncTask。

public class MyDataGrabber extends AsyncTask<Void,Void,Void> { 

    public interface Callback { 
     public void onComplete(String data); 
    } 
    public Callback callBack; 
    public MyDataGrabber(Callback callback) { // Initialize the callback 
     this.callBack = callback; 
    } 
    // on preExecute 
    // on doInBackground 
    public void onPostExecute(String data){ 
     this.callBack.onComplete(data); 
    } 
} 

// So when you call your async task it will look like this 

Dialog dialog; 
//.... set up and show dialog etc. 

new MyDataGrabber(new MyDataGrabber.Callback(){ 
    @Override 
    public void onComplete(String data){ 
     // Handle data 
     doDataHandling(); 
     // Dismiss dialog 
     if(dialog.isShowing){ 
      dialog.dismiss(); 
     } 
    } 
}).execute(String url...other data etc); 

Salauyou是正確的,雖然有關的AsyncTask的缺點,也有一些負面影響與它並行或串行取決於Android的API級別,以及併發性問題和異步任務是仍然在後臺運行的執行,甚至關閉應用程序後。通常需要編寫各種取消方法和弱引用才能正確處理。使用線程和處理程序絕對是一個有價值的解決方案。

+0

此外,許多進度對話框可以通過setSupportProgressBarIndeterminateVisibility(false | true)// appcompat version | setProgressBarIndeterminateVisibility(假|真) –

相關問題