Java 将AsyncTask用于多个操作

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

我在安卓系统工作

我在MainActivity.java中有一个ParseURL类,它扩展了AsyncTask:

该类解析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);
    }
}
私有类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);