2013-07-23 70 views
0

我有一個自定義服務模塊,我傳遞一個JSON正文,其中包含一個ID數組。我必須遍歷這些ID並使用每個ID分別進行Web服務調用以獲取響應主體,然後將這些響應聚合到自定義JSON結構中。我有這一切工作,但我想實現線程(或某種方式)異步,而不是連續的HTTP調用。我將如何實現線程在下面的代碼:Java - 線程HttpUrlConnection調用

ids = (JSONArray) jsonIn.get("IDs");  

    MyClass myClass = null; 
    List<MyClass> myClassList = new ArrayList<MyClass>(); 

    for (int i = 0; i < ids.size(); i++) { 
     JSONObject p = (JSONObject)ids.get(i); 
     id = p.get("ID").toString(); 

     //The HttpUrlConnection call is made in the getResponse() method 
     Gson gson = new Gson(); 
     MyClassResponse result = gson.fromJson(getResponse(), 
       MyClassResponse.class); 

     for (int x = 0; x < result.ids[0].id.length; x++) { 

      myClass = new MyClass(); 

      myClass.setStringOne(result.ids[0].fieldOne); 
      myClass.setStringTwo(result.ids[0].fieldTwo); 

      myClassList.add(x, myClass); 
     }   
    } 

    Gson gsonOut = new Gson(); 
    String jsonString = gsonOut.toJson(myClassList); 

    JsonArray jsonArray = new JsonParser().parse(jsonString).getAsJsonArray(); 

    JSONObject response = new JSONObject(); 
    response.put("CustomStructure", jsonArray); 

    //pass back custom JSON body 
+0

我嘗試我用Runnable,但我的困惑在於爲地方把/啓動線程(循環內部或外部)或我不知道是否有其他方法使用它更適合異步HTTP調用。 – bgeveritt

回答

0

這是我是如何實現它:

/***Code to execute threads***/ 
Thread[] threads = new Thread[ids.size()]; 

for (int i = 0; i < ids.size(); i++) { 
    JSONObject p = (JSONObject)id.get(i); 
    id = p.get("ID").toString(); 

    threads[i] = new Thread(new DoThread(id)); 
    threads[i].start(); 
} 

for(int i = 0; i < id.size(); i++) { 
    threads[i].join(); 
} 
/*****************************/ 

public class DoThread implements Runnable { 

    private String id; 
    public DoThread(String id) { 
     this.id = id; 
    } 

    public void run() { 

     //Do Work 

    } 
} 
0

使用此邏輯:

  • 創建一個Runnable,做你的循環做,構造函數把個人的JSONObject作爲輸入。
  • 將輸出MyClassResponse作爲成員變量存儲在runnable中。
  • 擁有的線程列表和Runnable接口的列表中聲明循環
  • 創建循環內的線程,可運行,並將其添加到列表中
  • 啓動線程循環內部
  • 循環調用線程後外。加入對每個線程列表的線程(這使得該線程等待,直到線程完成。)
  • 從可運行列表中創建MyClassList一旦所有的加盟語句返回