Android AsyncHttpClient LoopJ和保存onSuccess方法中的数据

Android AsyncHttpClient LoopJ和保存onSuccess方法中的数据,android,json,asynchronous,loopj,asynchttpclient,Android,Json,Asynchronous,Loopj,Asynchttpclient,我有一个叫做“invokeWS”的方法。我只想用listdata ArrayList更新我在应用程序中使用的ArrayAdapter适配器2,该列表从JSON文件获取数据。我尝试了不同的东西 onSuccess无效,因此我无法将任何内容返回主程序。我很乐意进入try,JSON被解析,我可以在控制台中看到我想要的字符串,但是一旦我退出onSuccess,我就会得到一个空的Arraylist。因此,当返回listdata时,它是空的 还必须将listdata声明为“final”,否则,只要list

我有一个叫做“invokeWS”的方法。我只想用listdata ArrayList更新我在应用程序中使用的ArrayAdapter适配器2,该列表从JSON文件获取数据。我尝试了不同的东西

  • onSuccess无效,因此我无法将任何内容返回主程序。我很乐意进入try,JSON被解析,我可以在控制台中看到我想要的字符串,但是一旦我退出onSuccess,我就会得到一个空的Arraylist。因此,当返回listdata时,它是空的
  • 还必须将listdata声明为“final”,否则,只要listdata在OnSuccess上,就会出现“从内部类访问”的错误
  • 还试图让ArrayAdapter adapter2在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;
    
    }
    
    publicstaticarraylistinvokews(){
    AsyncHttpClient=新的AsyncHttpClient();
    最终ArrayList listdata=新ArrayList();
    client.get(“http://xxx.xxx.xxx.xxx:8085/CompanyJersWS/company/showcompany,每次使用外部IP地址指定新的JsonHttpResponseHandler(){//地址
    @凌驾
    成功时的公共void(int statusCode,Header[]headers,JSONObject响应){
    System.out.println(“内部成功调用EWS”);
    试一试{
    JSONArray json=response.getJSONArray(“公司”);
    System.out.println(“JSON已解析!”+JSON.toString()+“长度为”+JSON.Length());
    System.out.println(“第一个值是”+json.getString(0));
    int i;
    
    对于(i=0;i您可以做的事情是,在成功传递“listdata”后,将创建的“listdata”作为函数的参数传递(例如“refreshData”):

    @覆盖
    成功时的公共void(int statusCode,Header[]headers,JSONObject响应){
    System.out.println(“内部成功调用EWS”);
    试一试{
    JSONArray json=response.getJSONArray(“公司”);
    System.out.println(“JSON已解析!”+JSON.toString()+“长度为”+JSON.Length());
    System.out.println(“第一个值是”+json.getString(0));
    int i;
    
    对于(i=0;i有问题,但我必须解决您建议的解决方案的问题!无需担心,已修复它!感谢您的建议!我还必须再次初始化sp1,因为否则它超出范围,但这是个好主意!Spinner sp1=(Spinner)findViewById(R.id.Spinner 2);
    ArrayList<String> tempval = invokeWS();
    
    ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,
            android.R.layout.simple_spinner_item, tempval.toArray(new String[tempval.size()]));
     sp1.setAdapter(adapter2);
    
        @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);
    
    }