如何保存AsyncTask中生成的数据?

时间:2012-04-22 01:11:52

标签: java android android-asynctask

我正在使用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()之后),但程序将崩溃。我不熟悉这些线程设置,感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

问题在于代码的设计。 AsyncTask异步发生,因此只要您在AsyncTask上调用执行,onCreate的其余部分就会立即执行。 AsyncTask基本上会在新主题上运行,并与您的Activity并行执行。

我认为您想要的是在TextView的{​​{1}}方法中设置onPostExecute。在AsyncTask完成后调用onPostExecute

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

答案 1 :(得分:2)

使用包含在主线程上初始化的Handler对象的线程,您将获得更好的服务。使用处理程序,您可以post()在主线程上执行小片段 - 比如更新进度条。您可以从AsyncTask执行相同的Handler技巧,但IMHO线程更清晰。

所述片段应实现为Runnable s。随意使用嵌套的匿名类一行。