简体   繁体   English

使用AsyncTask进行多个操作

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM