2012-04-22 37 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,然後我oncreate可以使用result1,以顯示它的TextView。但是,我的TextView在此設置中始終爲空。所以我移動

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

do0()(在result1 = do2()後右),但隨後的程序會崩潰。我不熟悉這些線程設置,感謝您的幫助。

回答

2

如果線程保留在主線程上初始化的Handler對象,那麼最好使用它。使用處理程序,您可以在主線程上執行一些小片段 - 例如更新進度條。您可以從AsyncTask執行相同的Handler技巧,但是恕我直言的線程更清晰。

表示片段應按Runnable s實施。隨意使用嵌套的匿名類一行。

+0

謝謝,這似乎是一個更好的代碼使用,但我從示例代碼中得到一個。我現在對這個權利不是很熟悉,但是我認爲當我有更成熟的編碼能力時,你的方法應該是應該的。感謝您的推薦。 – JLTChiu 2012-04-22 03:50:34

2

問題在於代碼的設計。 AsyncTask是異步發生的,因此只要您致電AsyncTask執行,onCreate的其餘部分將立即執行。 AsyncTask將基本上在新線程上運行並與您的Activity並行執行。

我想你想要的是在AsyncTaskonPostExecute方法中設置你的TextViewonPostExecutedoInBackground完成後被調用。

此外,請務必記住doInBackground發生在後臺線程上,因此您無法對UI中的代碼進行更改。 onPre/PostExecute在UI線程上運行,因此您可以在其中進行UI更改,但這些方法中的任何代碼也會阻止UI。

+0

謝謝,它的工作原理。感謝您澄清'activities'和'onPre/PostExecute'命令的用法。我從互聯網上的示例代碼中瞭解到這一點,所以不太熟悉它。我非常感謝你的幫助。 – JLTChiu 2012-04-22 03:49:08

相關問題