2012-12-08 43 views
1

我遇到了一個我不明白的問題。我想在Android中顯示一個簡單的進度對話框。所以我創建了一個AsyncTask並在構造函數中創建對話框。我使用方法onPreExceutioninitialise對話框和onPostExecute方法我使對話失效。所以直到現在,這看起來對我來說完全正確。但是當我在Nexus 7上啓動應用程序時,該對話框在作業完成之前不會顯示。所以在工作結束時顯示半秒鐘......我做錯了什麼?進度對話框僅在作業已完成時顯示

謝謝你的幫助;)

public class ParseHTMLCodeNew extends AsyncTask<String, Void, String> { 
    ProgressDialog dialog; 

    public ParseHTMLCodeNew(Context context) { 
     dialog = new ProgressDialog(context); 
    } 

    @Override 
    protected void onPreExecute() { 
     //einrichten des Wartedialogs 
     dialog.setTitle("Bitte warten!"); 
     dialog.setMessage("Die Kommentare werden vom Server geladen."); 
     dialog.show(); 
    } 

    @Override 
    protected String doInBackground(String params) { 
     InputStream is = null; 
     String data = ""; 
     try 
     { 
      URL url = new URL(params[0]); 
      is = url.openStream(); 
      data = new Scanner(is).useDelimiter("//html//").next(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return data; 
    } 

    @Override 
    protected void onPostExecute(String result) {  
     //Dialog beenden RSS Feed ist fertig geparst 
     if (dialog != null && dialog.isShowing()) { 
      dialog.dismiss(); 
     }   
    } 
} 

UPDATE

這是我的新的AsyncTask:

public class ParseHTMLCodeNew extends AsyncTask<String, String, String> { 
ProgressDialog dialog; 
private final OnCompleteTaskListener onCompleteTaskListener; 

public interface OnCompleteTaskListener { 
     void onComplete(String data); 
} 

public ParseHTMLCodeNew(Context context, OnCompleteTaskListener taskListener) { 
    onCompleteTaskListener = taskListener; 
    dialog = new ProgressDialog(context); 
} 


@Override 
protected void onPreExecute() { 

    //einrichten des Wartedialogs 
    dialog.setTitle("Bitte warten!"); 
    dialog.setMessage("Die Kommentare werden vom Server geladen."); 
    dialog.show(); 

} 

@Override 
protected String doInBackground(String... params) { 
    InputStream is = null; 
    String data = ""; 
    try 
    { 
     URL url = new URL(params[0]); 
     is = url.openStream(); 
     data = new Scanner(is).useDelimiter("//html//").next(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return data; 
} 

@Override 
protected void onPostExecute(String result){ 

    onCompleteTaskListener.onComplete(result); 

    //Dialog beenden RSS Feed ist fertig geparst 
    if (dialog != null && dialog.isShowing()) { 
     dialog.dismiss(); 
    } 




} 
} 

,我稱它是這樣的:

new ParseHTMLCodeNew(this,new OnCompleteTaskListener() { 

     @Override 
     public void onComplete(String data) { 
      gData = data; 

     } 
    }).execute(url); 

正如我評論你的文章,data沒有價值。

+1

這項工作需要多長時間才能完成? – DeeV

+0

告訴我們你是怎麼調用這段代碼的,看起來沒問題 – 2012-12-08 16:21:06

+0

我這樣調用代碼: data = new ParseHTMLCodeNew(CommentActivity.this).execute(url).get(); – Irazzer

回答

0

如果調用此代碼,以便顯示:因爲有阻塞UI

String data = new ParseHTMLCodeNew(CommentActivity.this).execute(url).get(); 

那麼你真的不明白你的對話。 方法get()在必要時等待計算完成,然後檢索其結果。

呼叫這樣:

new ParseHTMLCodeNew(CommentActivity.this).execute(url); 

和工作的結果在的AsyncTask直接處理。

如果您需要將數據傳輸到主線程,則應該告訴他任務已完成。 笏是簡單的代碼,我只是說OnCompleteTaskListener接口

public class ParseHTMLCodeNew extends AsyncTask<String, Void, String> { 

    private final OnCompleteTaskListener onCompleteTaskListener; 
    private ProgressDialog dialog; 

    public interface OnCompleteTaskListener { 
     void onComplete(String data); 
    } 

    public ParseHTMLCodeNew(Context context, OnCompleteTaskListener taskListener) { 
     onCompleteTaskListener = taskListener; 
     dialog = new ProgressDialog(context); 
    } 

    @Override 
    protected void onPreExecute() { 

     // einrichten des Wartedialogs 
     dialog.setTitle("Bitte warten!"); 
     dialog.setMessage("Die Kommentare werden vom Server geladen."); 
     dialog.show(); 

    } 

    @Override 
    protected String doInBackground(String... params) { 
     StringBuilder sb = new StringBuilder(); 

     // your code here 
     try { 
      for (int i = 0; i < 100; i++) { 
       Thread.sleep(100); 
       sb.append(i); 
      } 

     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     return sb.toString(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 

     // Dialog beenden RSS Feed ist fertig geparst 
     if (dialog != null && dialog.isShowing()) { 
      dialog.dismiss(); 
     } 

     onCompleteTaskListener.onComplete(result); 
    } 
} 

和呼叫

new ParseHTMLCodeNew(this,new OnCompleteTaskListener() { 

      @Override 
      public void onComplete(String data) { 
       Toast.makeText(CommentActivity.this, data, Toast.LENGTH_LONG).show(); 

      } 
     }).execute("your_url"); 

小心的例子,當你旋轉你的手機驗證碼可以產生錯誤。 當活動被破壞但任務執行時: - 進度對話框將關閉並且不會再次打開 - 對話框或上下文的局部變量不正確。

如果操作執行很長時間可以使其通過該服務?

+0

上運行,以解決進度對話框中的問題。謝謝! 但我沒有從onComplete方法得到任何結果...數據總是空的......我的猜測是它不會跳入onPostExceutive方法。至少我看不到當我正在調試 – Irazzer

+0

顯示您的所有AsyncTask代碼 – avesha

+0

我將它添加到主文章 – Irazzer

0

我寫了一個代碼,從在線數據庫獲取數據並在lisview中填充數據,這裏是我的代碼的一部分,希望對您有所幫助!

class LoadMyData extends AsyncTask<String, String, String> { 
     //Before starting background thread Show Progress Dialog 

     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(getParent()); 
      pDialog.setMessage("Loading. Please wait..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 


     protected String doInBackground(String... args) { 

        //Your code here 

      return null; 
     } 

     /** 
     * After completing background task Dismiss the progress dialog 
     * **/ 
     protected void onPostExecute(String file_url) { 
      // dismiss the dialog after getting the data 
      pDialog.dismiss(); 
      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 
        // In my case use my adapter to display the data in a listview 


        adapter = new MyAdaper(); 
        list.setAdapter(adapter); 
       } 
      }); 
     } 
    } 
+0

不......這和我的幾乎一樣:/ – Irazzer

0

進度對話框應該從UI線程

runOnUiThread(new Runnable() { 
      public void run() { 
dialog.setTitle("Bitte warten!"); 
dialog.setMessage("Die Kommentare werden vom Server geladen."); 
dialog.show(); 
}}); 
+0

我不認爲這個解決方案對我有用。我不得不使用asyncTask,因爲網絡訪問... – Irazzer

+0

是的,請使用asynctasks,但是在preExecute和postExecute方法中,任何對話框的訪問都應該在UI線程 –