2014-10-17 78 views
1

我在android中工作。使用AsyncTask进行多个操作

我有一个的parseURL类在我MainActivity.java延伸的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); 
    } 
} 

我的问题是 - 如果我想再次使用的AsyncTask解析另一页 - 但与解析的页面不同的动作 -

我应该使用相同的类或创建一个新的?

什么是正确的方法?有一个“if”语句或类似的东西来检查如何处理解析的页面?或者有几个AsyncTask类可以完成不同的工作?

thnaks提前, 奥菲克

+3

那要看情况。什么是不同行为的例子?如果你可以简单地传递不同的'params',那么就使用同一个类。 – codeMagic 2014-10-17 12:58:21

+1

[看看](http://nobalg.tumblr.com/post/98543748225/android-asynctasks-one-after-the-other) – nobalG 2014-10-17 13:02:03

+0

@codeMagic thnaks为您的答案。可以说第一份工作是用来自URL的一些数据填充列表。第二项工作是查看列表并根据用户的组合框选择从不同的URL中提取一些数据。 (两个不同的工作)。你认为可以有两个AsyncTask类吗?或者有一个可以根据某个参数执行两个任务 – 2014-10-17 13:22:51

回答

0

传递另一个参数doinbackground功能有关这表明这一参数,你url.Based写你的行动。

+0

你的意思是传递一个参数,指出该方法要做什么?并且比如有一个开关柜,根据该参数采取行动 – 2014-10-17 13:10:44

0

在执行命令中,您可以执行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 
    } 
} 
+0

@DanielHussain thnaks为您的答案。可以说第一份工作是用来自URL的一些数据填充列表。第二项工作是查看列表并根据用户的组合框选择从不同的URL中提取一些数据。 (两个不同的工作)。你认为可以有两个AsyncTask类吗?或者有一个将根据一些参数做两个工作 – 2014-10-17 13:25:01

+0

在我看来创建两个任务。如果我的回答可以帮助你,然后投票并选中答案。谢谢 – 2014-10-17 13:59:05

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); 
+0

感谢您的回答。如果我使用两个不同的类,会有所作为吗?或者只有一个可以执行这两个操作?我的意思是如果一个人比另一个人好,为什么。还有一个问题 - 我应该把这些类放在MainAcitivity中,并且让它们是私有的,或者像其他类一样放在src文件夹中并让它们公开? – 2014-10-17 13:28:07

+1

这是关于代码重复的一切。如果你的2个课程要分享的不仅仅是相关数量的代码,还可以用一个内部开关逻辑创建一个课程 – ToYonos 2014-10-17 13:34:02