2017-02-12 3 views
0

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

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

    Вот как я пытаюсь вызвать invokeWS() из моего основного класса;

    ArrayList<String> tempval = invokeWS(); 
    

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

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

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

ответ

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

} 
+0

Спасибо, но у меня возникли проблемы с решением, которое вы предложили! –

+0

Nevermind, исправил это! Спасибо за предложение! Мне также пришлось инициализировать sp1 еще раз, потому что в противном случае это было вне сферы действия, но хорошая идея! Spinner sp1 = (Spinner) findViewById (R.id.spinner2); –

+0

Ницца !, добро пожаловать =) – Diekrul