[英]using AsyncTask for multiple actions
I am working in android. 我在android中工作。
I have a ParseURL class in my MainActivity.java that extends AsyncTask: 我的MainActivity.java中有一个ParseURL类,它扩展了AsyncTask:
the class parses a URL and then does some work with it. 该类解析URL,然后对其进行一些处理。
private class ParseURL extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... strings) {
StringBuffer buffer = new StringBuffer();
Document doc;
try {
Log.i("output", "trying to connect..");
doc = Jsoup.connect("http://sirim.co.il/").get();
Log.i("output", "connected");
Elements metaElems = doc.select("a[class=mainlevelmatkonim]");
for (Element metaElem : metaElems) {
String c = metaElem.text();
buffer.append(c + "\r\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return buffer.toString();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
httpInfo.setText(s);
}
}
my question is - if I want to use again a AsyncTask to parse another page - but do different actions with the parsed page - 我的问题是-如果我想再次使用AsyncTask来解析另一个页面-但是对解析的页面执行不同的操作-
should I use the same class or create a new one? 我应该使用相同的类还是创建一个新的类?
what is the right way? 正确的方法是什么? have a "if" statement or something like that to check what to do with the parsed page?
有一个“如果”语句或类似的东西来检查解析的页面怎么办? or have a few AsyncTask classes that do different work?
还是有一些AsyncTask类可以做不同的工作?
thnaks in advance, Ofek 提前致谢,Ofek
Use a parameter for your task : 为您的任务使用参数:
private class ParseURL extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... url) {
StringBuffer buffer = new StringBuffer();
Document doc;
try {
Log.i("output", "trying to connect..");
doc = Jsoup.connect(url[0]).get();
Log.i("output", "connected");
Elements metaElems = doc.select("a[class=mainlevelmatkonim]");
for (Element metaElem : metaElems) {
String c = metaElem.text();
buffer.append(c + "\r\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return buffer.toString();
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
httpInfo.setText(s);
}
}
Use it like this : 像这样使用它:
ParseURL task = new ParseURL();
task.execute("http://sirim.co.il/");
But you would have to recreate the task everytime you have to use it again 但是您每次必须再次使用它时都必须重新创建任务
The task can be executed only once (an exception will be thrown if a second execution is attempted.) 该任务只能执行一次(如果尝试第二次执行,则会引发异常。)
You could create a helper in ParseURL
您可以在
ParseURL
创建一个帮助ParseURL
private class ParseURL extends AsyncTask<String, Void, String> {
public static void parse(String url)
{
ParseURL task = new ParseURL();
task.execute(url);
return task;
}
// [...]
And use it like this : 并像这样使用它:
ParseURL task = ParseURL.parse("http://sirim.co.il/");
About the different action 关于不同的动作
You could adapt your OnPostExecute method, and you use an enum to switch between action 您可以调整OnPostExecute方法,并使用枚举在动作之间进行切换
private class ParseURL extends AsyncTask<String, Void, String> {
public enum ParseURLAction {ACTION1, ACTION2, ACTION3};
public static void parse(String url, ParseURLAction action)
{
ParseURL task = new ParseURL(action);
task.execute(url);
return task;
}
private ParseURLAction action;
public ParseURL(ParseURLAction action)
{
this.action = action;
}
// [...]
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
switch (action)
{
case ACTION1:
// TODO something
break;
// [...]
}
Usage : 用法:
ParseURL task = ParseURL.parse("http://sirim.co.il/", ParseURL.ParseURLAction.ACTION1);
将另一个参数传递给doinbackground函数,该参数指示您的网址。基于该参数编写您的操作。
In execute command you can of asyc task you can pass as many paramters as you can. 在execute命令中,可以执行asyc任务,并且可以传递尽可能多的参数。
ParseURL task = new ParseURL();
task.execute(parameter1, parameter2, parameter3);
@Override
protected String doInBackground(String... strings) {
if(strings[0]== your condition){
// do this
}
if(strings[1]== your condition){
// do this
}
if(strings[2]== your condition){
// do this
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.