使用AsyncTask进行多个操作

时间:2014-10-17 12:56:34

标签: java android android-asynctask

我在android工作。

我的MainActivity.java中有一个扩展AsyncTask的ParseURL类:

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

我的问题是 - 如果我想再次使用AsyncTask来解析另一个页面 - 但是对解析后的页面执行不同的操作 -

我应该使用同一个课程还是创建一个新课程?

正确的方法是什么?有一个&#34; if&#34;声明或类似的东西来检查如何处理解析的页面?或者有几个不同的AsyncTask类?

提前th ,, 地平线

3 个答案:

答案 0 :(得分:1)

为您的任务使用参数:

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 task = new ParseURL();
task.execute("http://sirim.co.il/");

但您必须重新创建任务everytime you have to use it again

该任务只能执行一次(如果尝试第二次执行,则会抛出异常。)

您可以在ParseURL

中创建帮助器
private class ParseURL extends AsyncTask<String, Void, String> {

    public static void parse(String url)
    {
        ParseURL task = new ParseURL();
        task.execute(url);
        return task;
    }

    // [...]

并像这样使用它:

ParseURL task = ParseURL.parse("http://sirim.co.il/");

关于不同的行动

您可以调整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;

           // [...]     
   }

用法:

ParseURL task = ParseURL.parse("http://sirim.co.il/", ParseURL.ParseURLAction.ACTION1);

答案 1 :(得分:0)

将另一个参数传递给doinbackground函数,该函数指示你的url。基于该参数编写你的行为。

答案 2 :(得分:0)

在执行命令中,您可以使用异步任务传递尽可能多的参数。

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
   }
 }
相关问题