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