Java 将AsyncTask用于多个操作
我在安卓系统工作 我在MainActivity.java中有一个ParseURL类,它扩展了AsyncTask: 该类解析URL,然后对其执行一些操作Java 将AsyncTask用于多个操作,java,android,android-asynctask,Java,Android,Android Asynctask,我在安卓系统工作 我在MainActivity.java中有一个ParseURL类,它扩展了AsyncTask: 该类解析URL,然后对其执行一些操作 private class ParseURL extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... strings) { StringBuffer buffer = n
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);
}
}
私有类ParseURL扩展异步任务{
@凌驾
受保护的字符串背景(字符串…字符串){
StringBuffer=新的StringBuffer();
文件文件;
试一试{
Log.i(“输出”,“尝试连接…”);
doc=Jsoup.connect(“http://sirim.co.il/).get();
Log.i(“输出”、“连接”);
Elements metaElems=doc.select(“a[class=mainlevelmatkonim]”;
用于(图元图元图元:图元图元){
字符串c=metaElem.text();
buffer.append(c+“\r\n”);
}
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
返回buffer.toString();
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
httpInfo.setText;
}
}
我的问题是—
如果我想再次使用AsyncTask解析另一个页面,但对解析的页面执行不同的操作-
我应该使用同一个类还是创建一个新类?
正确的方法是什么?是否有一个“if”语句或类似的语句来检查如何处理已解析的页面?或者有几个AsyncTask类执行不同的工作
事先,
Ofek将另一个参数传递给doinbackground函数,该函数指示您的url。根据该参数编写您的操作。在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
}
}
为任务使用参数:
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);
}
}
但您必须重新创建任务
该任务只能执行一次(如果尝试第二次执行,将引发异常)
您可以在ParseURL
private class ParseURL extends AsyncTask<String, Void, String> {
public static void parse(String url)
{
ParseURL task = new ParseURL();
task.execute(url);
return task;
}
// [...]
关于不同的动作
您可以调整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;
// [...]
}
那要看情况。不同行动的例子是什么?如果您可以简单地传递不同的
参数
,那么只需使用相同的类即可。@codeMagic thnaks作为您的答案。假设第一项工作是用URL中的一些数据填充列表。第二项工作是浏览列表,根据用户的组合框选择从不同的URL提取一些数据。(两份完全不同的工作)。您认为有两个AsyncTask类可以吗?或者有一个可以根据某些参数同时执行两项任务。两个都可以,但是,根据从列表中提取数据所需的时间,您可以在UI线程上执行这项任务,而不需要第二个任务。如果它只供该活动使用,则将其作为内部类,因为没有其他人需要它。如果其他活动将使用它,请将其放入自己的文件中。您的意思是传递一个参数,该参数指示在方法中执行的操作?而不是有一个开关的情况下,例如,做的行动取决于这一点parameter@DanielHussain谢谢你的回答。假设第一项工作是用URL中的一些数据填充列表。第二项工作是浏览列表,根据用户的组合框选择从不同的URL提取一些数据。(两份完全不同的工作)。您认为有两个AsyncTask类可以吗?或者有一个可以根据一些参数同时完成两项工作,我认为可以创建两项任务。如果我的答案对你有帮助,那就投赞成票,并在答案上打勾。谢谢你的回答。如果我使用两个不同的类,会有什么不同吗?或者只有一个可以同时做这两个动作?我的意思是如果一个比另一个好,为什么。还有一个问题——我应该把类放在MainActivity中,让它们成为私有的,还是像其他类一样放在src文件夹中,让它们成为公共的?这都是关于代码复制的。如果您的两个类将共享更多的相关代码,那么最好使用内部切换逻辑创建一个类
ParseURL task = ParseURL.parse("http://sirim.co.il/");
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;
// [...]
}
ParseURL task = ParseURL.parse("http://sirim.co.il/", ParseURL.ParseURLAction.ACTION1);