2014-10-17 74 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