【问题标题】:AsyncHttpClient LoopJ and preserving data from onSuccess methodAsyncHttpClient LoopJ 并保留来自 onSuccess 方法的数据
【发布时间】:2017-02-12 19:33:33
【问题描述】:

我有这个方法叫做“invokeWS”。我要做的就是使用从 JSON 文件获取数据的 listdata ArrayList 更新我在应用程序中使用的 ArrayAdapter 适配器2。我尝试了不同的方法。

  • onSuccess 无效,因此我无法将任何内容返回到主程序。我很高兴进入尝试,JSON 被解析,我可以在控制台中看到我想要的字符串,但是一旦我退出 onSuccess,我就会得到一个空的 Arraylist。所以返回时listdata为空。
  • 还必须将 listdata 声明为“final”,否则无论 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);
    

感谢阅读!

【问题讨论】:

    标签: android json asynchronous loopj asynchttpclient


    【解决方案1】:

    您可以做的是,在 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);
    
    }
    

    【讨论】:

    • 谢谢,但我对您建议的解决方案有疑问!
    • 没关系,修好了!感谢您提出这个建议!我还不得不再次初始化 sp1,否则它超出了范围,但好主意!微调器 sp1 = (微调器) findViewById(R.id.spinner2);
    猜你喜欢
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2013-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多