2017-02-12 78 views
0

我有這種方法稱爲「invokeWS」。我想要做的就是更新我的應用程序中使用的ArrayAdapter adapter2,它使用listdata ArrayList從JSON文件獲取數據。我嘗試了不同的事情。AsyncHttpClient LoopJ和保留數據從onSuccess方法

  • onSuccess無效,所以我不能返回任何東西到主程序。我很樂意嘗試,JSON被解析,我可以在控制檯中看到我想要的字符串,但是一旦離開onSuccess,我就會得到一個空的Arraylist。所以當返回列表數據是空的。
  • 只好也宣佈了listData「最終」,否則「從內部類訪問」錯誤似乎哪裏的ListData是對的onSuccess
  • 還試圖讓一個ArrayAdapter適配器2內的onSuccess被更新,但沒有工作,因爲據說它超出了範圍。
  • 我打算實現onFinish方法,但它甚至在JSON解析出於一個奇怪的原因之前被調用。

    public static ArrayList<String> invokeWS() { 
    AsyncHttpClient client = new AsyncHttpClient(); 
    final ArrayList<String> listdata = new ArrayList<String>(); 
    client.get("http://xxx.xxx.xxx.xxx:8085/CompanyJersWS/company/showcompany", new JsonHttpResponseHandler() { //address to be specified each time, using external IP address 
    
    
          @Override 
          public void onSuccess(int statusCode, Header[] headers, JSONObject response) { 
           System.out.println("Inside Success invokeWS"); 
           try { 
            JSONArray json = response.getJSONArray("Companies"); 
            System.out.println("JSON is parsed!" +json.toString() + "Length is " + json.length()); 
            System.out.println("First value is " + json.getString(0)); 
            int i; 
            for (i=0;i<json.length();i++) 
             listdata.add(json.getString(i)); 
            System.out.println("Listdata contains" +listdata); 
    
    
           } catch (Exception e) { 
            System.out.println("FAILED invokeWS"); 
            e.printStackTrace(); 
           } 
          } 
         } 
    
    
    
    ); 
    
    System.out.println("Listdata out of scope contains" +listdata); 
    
    return listdata; 
    
    } 
    

    這是我如何試圖從我的主類調用invokeWS();

    ArrayList<String> tempval = invokeWS(); 
    

    這是adapter2寫在主類,我想從json文件listdata作爲內容。

    ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this, 
         android.R.layout.simple_spinner_item, tempval.toArray(new String[tempval.size()])); 
    sp1.setAdapter(adapter2); 
    

感謝您的閱讀!

回答

0

有些事情,你可以做的是,的onSuccess傳遞你創建了一個函數的參數(例如「refreshData」)了「的ListData」之後:

@Override 
     public void onSuccess(int statusCode, Header[] headers, JSONObject response) { 
      System.out.println("Inside Success invokeWS"); 
      try { 
       JSONArray json = response.getJSONArray("Companies"); 
       System.out.println("JSON is parsed!" +json.toString() + "Length is " + json.length()); 
       System.out.println("First value is " + json.getString(0)); 
       int i; 
       for (i=0;i<json.length();i++){ 
        listdata.add(json.getString(i)); 
       } 
      System.out.println("Listdata contains" +listdata); 
      refreshData(listdata); 
      } catch (Exception e) { 
       System.out.println("FAILED invokeWS"); 
       e.printStackTrace(); 
      } 

     } 

,然後使用該功能更新陣列與新的列表:

public void refreshData(ArrayList<String> listdata){ 
    ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this, 
    android.R.layout.simple_spinner_item, listdata); 
    sp1.setAdapter(adapter2); 

} 
+0

謝謝,但我不得不問你的建議雖然解決方案! –

+0

沒關係,修復它! 感謝您的建議!我還必須再次初始化sp1,否則它會超出範圍,但是這是個好主意! Spinner sp1 =(Spinner)findViewById(R.id.spinner2); –

+0

不錯!不客氣=) – Diekrul

相關問題