2012-04-22 2 views
0

Android AsyncTask에서 작업 중입니다. 프로그램을로드하는 동안 진행률 표시 줄을 만들고 싶습니다. 다음은 내가 만드는 방법입니다.AsyncTask에서 생성 된 데이터를 보존하는 방법은 무엇입니까?

A class is declared here... 
private ArrayList<String> result1 = new ArrayList<String>(); //class variable 

onCreate() 
{ 
    Some stuff here... 
    new ATask().execute(); 
    for (int i = 0; i <result1.size();i++) 
    { 
     output = output +result1.get(i) + "\n\n"; 
    } 
    textView.setText(output); 
} 
private void do0() 
{ 
    ArrayList<Sentence> result = new ArrayList<Sentence>(); 
    ArrayList<String> result2 = new ArrayList<String>(); 
    result = do1("link", true); //just some function I am working 
    result1 = do2(result,10);//do2 return ArrayList<String> 
} 
private class ATask extends AsyncTask<String, Void, String>{ 
    private ProgressDialog progress = null; 
    @Override 
    protected String doInBackground(String... params) { 
     do0(); 
     return null; 
    } 

    @Override 
    protected void onCancelled() { 
     super.onCancelled(); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     progress.dismiss(); 

     //adapter.notifyDataSetChanged(); 

     super.onPostExecute(result); 
    } 

    @Override 
    protected void onPreExecute() { 
     progress = new ProgressDialog(ReadWebPage.this); 

     progress.setMessage("Doing..."); 
     progress.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     progress.show(); 

     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 
}; 

내 의도는 진행률 표시 줄을로드하는 동안, 그것은 do0()을 완료 한 후 result1을 수정할 것이라고 내 oncreateTextView을의에 result1 표시 할 것을 사용할 수 있습니다. 그러나이 설정에서는 내 TextView이 항상 비어 있습니다. 그래서 do0() (직후 result1 = do2())에

 for (int i = 0; i <result1.size();i++) 
    { 
     output = output +result1.get(i) + "\n\n"; 
    } 
    textView.setText(output); 

를 이동하지만 프로그램이 충돌합니다. 나는이 스레드 설정에 익숙하지 않다. 사전에 도움을 주셔서 감사합니다.

답변

2

기본 스레드에서 초기화 된 Handler 개체를 보유하고있는 스레드를 사용하는 것이 더 나을 것입니다. 처리기를 사용하면 post() 메인 스레드에서 실행될 작은 스 니펫 (예 : 진행률 막대 업데이트)을 수행 할 수 있습니다. AsyncTask에서 동일한 Handler 트릭을 수행 할 수 있지만 IMHO 스레드는 더 깨끗합니다.

상기 발췌문은 Runnable으로 구현되어야합니다. 중첩 된 익명 클래스 one-liner를 자유롭게 사용할 수 있습니다.

+0

감사합니다.이 코드를 더 잘 사용하는 것처럼 보이지만 샘플 코드에서 사용하는 코드를 얻습니다. 저는 지금 당장이 상황에 익숙하지 않지만 좀 더 성숙한 코딩 능력을 갖춰야 할 때 당신의 접근 방식을 생각해야합니다. 귀하의 추천에 감사드립니다. – JLTChiu

2

문제는 코드 디자인에 있습니다. AsyncTask은 비동기식으로 발생하므로 AsyncTask에서 실행을 호출하면 onCreate의 나머지 부분이 즉시 실행됩니다. AsyncTask은 기본적으로 새 스레드에서 실행되며 Activity과 병렬로 실행됩니다.

내가 생각하기에 귀하의 AsyncTaskonPostExecute 방법에 귀하의 TextView을 설정하는 것이 좋습니다. onPostExecutedoInBackground 이후에 호출됩니다.

또한 배경 스레드에서 doInBackground이 발생하므로 코드 내의 Activity's UI를 변경할 수 없다는 점에 유의해야합니다. onPre/PostExecute이 UI 스레드에서 실행되므로 UI ​​변경이 가능하지만 해당 메소드 내의 모든 코드는 UI를 차단합니다.

+0

감사합니다. 작동합니다. 'activities'와'onPre/PostExecute' 명령의 사용법을 설명해 주셔서 감사합니다. 인터넷의 샘플 코드에서이 정보를 얻으므로 익숙하지 않습니다. 당신의 도움에 진심으로 감사드립니다. – JLTChiu

관련 문제