0

我正在研究 Android 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()),但随后程序将崩溃。我对这些线程设置不熟悉,提前感谢您的帮助。

4

2 回答 2

2

问题在于代码的设计。 AsyncTask异步发生,因此只要您调用 execute ,AsyncTask其余部分onCreate将立即执行。 AsyncTask本质上将在一个新线程上运行并与您的Activity.

我认为你想要的是在你TextViewonPostExecute方法中设置你的AsyncTask. onPostExecute完成后被调用doInBackground

此外,请务必记住,这doInBackground发生在后台线程上,因此您无法从其中的代码更改Activity'sUI。 onPre/PostExecute在 UI 线程上运行,因此您可以在那里进行 UI 更改,但这些方法中的任何代码也会阻塞 UI。

于 2012-04-22T01:49:18.880 回答
2

Handler拥有在主线程上初始化的对象的线程会更好地为您服务。使用处理程序,您可以post()在主线程上执行一些小片段——比如更新进度条。您可以从 AsyncTask 执行相同的处理程序技巧,但恕我直言,线程更干净。

所述片段应实现为Runnables. 随意使用嵌套匿名类单线。

于 2012-04-22T02:33:00.307 回答