2012-12-08 1 views
1

나는 이해하지 못하는 문제가 있습니다. Android에서 간단한 진행 대화 상자를 보여 드리고자합니다. 그래서 AsyncTask을 만들고 생성자에서 대화 상자를 만듭니다. 대화 상자를 onPreExceution에서 initialise까지 사용하고 대화 상자를 표시하는 방법을 사용합니다. 그래서 지금까지는 이것이 나를 위해 정확 해 보입니다. 하지만 Nexus 7에서 앱을 시작하면 작업이 완료 될 때까지 대화 상자가 표시되지 않습니다. 그래서 직업이 끝나면 1 초 반 동안 나타납니다 ... 내가 뭘 잘못하고 있니? 진행률 대화 상자는 작업이 이미 완료되었을 때만 나타납니다.

는 당신의 도움을 주셔서 감사합니다, 이것은 나의 새로운 AsyncTask를이

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

입니다) :

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

우리는이 코드를 어떻게 호출하는지 알 수 있습니다. –

+0

코드를 이렇게 호출합니다. data = new ParseHTMLCodeNew (CommentActivity.is) .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 메서드에서 결과를 얻지 못했습니다 ... 데이터는 항상 null입니다 ... 내 추측은 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 스레드 –