AsyncHttpClient LoopJ并保留onSuccess方法中的数据

时间:2017-02-12 19:33:33

标签: android json asynchronous loopj asynchttpclient

我有这个名为“invokeWS”的方法。我想做的就是更新我在app中使用的ArrayAdapter adapter2,它使用listdata ArrayList从JSON文件中获取数据。我尝试了不同的东西。

  • onSuccess无效,所以我无法向主程序返回任何内容。我很高兴进入尝试,JSON被解析,我可以在控制台中看到我想要的字符串,但是当我离开onSuccess时,我得到一个空的Arraylist。所以返回时listdata是空的。
  • 还必须声明listdata“final”,否则将出现“从内部类访问”的错误,只要listData在OnSuccess上,
  • 还试图让onAdccess内的ArrayAdapter适配器2更新,但因为它超出了范围而无法正常工作。
  • 我打算实现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);
    

感谢阅读!

1 个答案:

答案 0 :(得分:0)

你可以做的是,在onSuccess之后传递你创建的“listdata”,就像函数的参数一样(例如“refreshData”):

    @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);

}