Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何保存异步任务中生成的数据?_Java_Android_Android Asynctask - Fatal编程技术网

Java 如何保存异步任务中生成的数据?

Java 如何保存异步任务中生成的数据?,java,android,android-asynctask,Java,Android,Android Asynctask,我正在做Android异步任务,我希望在我的程序加载期间制作一个进度条。我是这样做的 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 &l

我正在做Android异步任务,我希望在我的程序加载期间制作一个进度条。我是这样做的

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

问题在于代码的设计
AsyncTask
是异步执行的,因此只要对
AsyncTask
调用execute,其余的
onCreate
就会立即执行
AsyncTask
将在新线程上运行,并与您的
活动并行执行

我想您需要的是在
AsyncTask
onPostExecute
方法中设置
TextView
onPostExecute
doInBackground
完成后被调用


另外,重要的是要记住,
doInBackground
发生在后台线程上,因此您不能从
活动的
UI中的代码对其进行更改
onPre/PostExecute
在UI线程上运行,因此您可以在那里进行UI更改,但这些方法中的任何代码也会阻止UI。

问题在于代码的设计
AsyncTask
是异步执行的,因此只要对
AsyncTask
调用execute,其余的
onCreate
就会立即执行
AsyncTask
将在新线程上运行,并与您的
活动并行执行

我想您需要的是在
AsyncTask
onPostExecute
方法中设置
TextView
onPostExecute
doInBackground
完成后被调用


另外,重要的是要记住,
doInBackground
发生在后台线程上,因此您不能从
活动的
UI中的代码对其进行更改
onPre/PostExecute
在UI线程上运行,因此您可以在那里进行UI更改,但是这些方法中的任何代码也会阻止UI。

您最好使用一个线程,该线程包含一个在主线程上初始化的
处理程序
对象。使用该处理程序,您可以
post()。您可以从AsyncTask执行相同的处理程序技巧,但IMHO线程更干净


所述代码段应实现为
Runnable
s。您可以随意使用嵌套的匿名类一行程序。

使用一个线程更好地为您提供服务,该线程包含一个在主线程上初始化的
处理程序
对象。使用该处理程序,您可以
post()。您可以从AsyncTask执行相同的处理程序技巧,但IMHO线程更干净


所述代码段应实现为
Runnable
s。请随意使用嵌套的匿名class one liner。

谢谢,它可以工作。感谢您对
活动
onPre/PostExecute
命令用法的说明。我是从互联网上的示例代码中得到的,所以对它不是很熟悉。我非常感谢你的帮助。谢谢,很有效。感谢您对
活动
onPre/PostExecute
命令用法的说明。我是从互联网上的示例代码中得到的,所以对它不是很熟悉。我非常感谢您的帮助。谢谢,这似乎是代码的更好用法,但我从示例代码中得到了我使用的代码。我现在不太熟悉这一点,但我认为当我有了更成熟的编码能力时,你的方法应该是应该的。谢谢你的推荐。谢谢,这似乎是一个更好的代码用法,但是我从示例代码中得到了我使用的。我现在不太熟悉这一点,但我认为当我有了更成熟的编码能力时,你的方法应该是应该的。谢谢你的推荐。
     for (int i = 0; i <result1.size();i++)
    {
        output = output +result1.get(i) + "\n\n";
    }
    textView.setText(output);