AsyncHttpClient LoopJ и сохранение данных из метода onSuccess

У меня есть этот метод под названием "invokeWS". Все, что я хочу сделать, это обновить адаптер ArrayAdapter2, который я использую в своем приложении, с помощью listdata ArrayList, который получает данные из файла JSON. Я пробовал разные вещи.

  • onSuccess недействителен, поэтому я не могу ничего вернуть в основную программу. Я могу зайти внутрь try, JSON анализируется, и я вижу нужные строки в консоли, но как только я выхожу из onSuccess, я получаю пустой Arraylist. Поэтому при возврате listdata пуст.
  • Пришлось также объявить listdata «окончательным», иначе ошибки «доступ из внутреннего класса» появятся везде, где listdata находится в OnSuccess.
  • Также пытался обновить адаптер ArrayAdapter2 внутри 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();
    

    и это адаптер2, написанный в основном классе, который я хочу иметь в качестве содержимого listdata из файла json.

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

Спасибо за чтение!


person Panagiotis F    schedule 12.02.2017    source источник


Ответы (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);

}
person Diekrul    schedule 12.02.2017
comment
Спасибо, но у меня проблемы с решением, которое вы предложили! - person Panagiotis F; 13.02.2017
comment
Ничего себе, исправил! Спасибо, что предложили это! Мне также пришлось еще раз инициализировать sp1, потому что в противном случае это было бы невозможно, но хорошая идея! Spinner sp1 = (Spinner) findViewById(R.id.spinner2); - person Panagiotis F; 13.02.2017