2012-07-02 2 views
0

Я новичок в android, и это мой первый раз, используя AsyncTask. Я сделал очень простой веб-сервис, который возвращает ArrayList, какКак заполнить ArrayList после получения его с webservice в Android

package pk.mazars.basitMahmood.weatherReport; 

public class WeekDays { 

    private String name; 
    private String weather; 
    private float temperature; 

    public WeekDays(String name, String weather, float temperature) {  
     this.name = name; 
     this.weather = weather; 
     this.temperature = temperature;   
    } //end of constructor 
    //--------------Getters and Setters 
} //end of class WeekDays 

public class WeatherReport { 

    public ArrayList<WeekDays> weatherReport() { 

     ArrayList<WeekDays> weatherList = new ArrayList<WeekDays>(); 
     weatherList.add(new WeekDays("Monday", "Cloudy", 29.5F)); 
     weatherList.add(new WeekDays("Tuesday", "Normal", 32.3F)); 
     weatherList.add(new WeekDays("Wednesday", "Sunny", 37.7F)); 
     weatherList.add(new WeekDays("Thursday", "Cold", 20.2F)); 
     weatherList.add(new WeekDays("Friday", "Normal", 31.4F)); 
     weatherList.add(new WeekDays("Saturday", "Rainy", 22.6F)); 
     weatherList.add(new WeekDays("Sunday", "Rainy", 27.9F)); 

     return weatherList;  
    } 
} //end of class WeatherReport 

Тогда на андроид стороне я использовал код

public class MainActivity extends Activity { 

    Button btnStart; 
    MyTask objMyTask; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     btnStart = (Button) findViewById(R.id.btnstart); 
     btnStart.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View view) { 

       objMyTask = new MyTask(MainActivity.this);    
       objMyTask.execute();     
      }   
      }); //end of anonymous class   
     } //end of onCreate()  
    } //end of class MainActivity 

и вот моя задача

public class MyTask extends AsyncTask<Void, Void, ArrayList<?>> { 

    ProgressDialog dialog = null; 
    Object result = null; 
    MainActivity mainActivity; 

    public MyTask(MainActivity mainActivity) {  
     this.mainActivity = mainActivity ;   
    } 

    @Override 
    protected void onPreExecute() {  
     super.onPreExecute(); 
     if (dialog == null) {   
      dialog = new ProgressDialog(mainActivity);   
     }   
     dialog.setMessage("Please Wait. Your authentication is in progress");  
     dialog.show();  
    } //end of onPreExecute() 

    @Override 
    protected ArrayList<?> doInBackground(Void... params) {  
     callWebService();   
     return null;   
    } //end of doInBackground() 

    @Override 
    protected void onPostExecute(ArrayList<?> result) {  
     super.onPostExecute(result); 
     dialog.dismiss(); 
    } //end of onPostExecute() 

} //end of class MyTask 

Вот метод webservice

private void callWebService() { 
    ...  
    try { 

     SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 
     envelope.dotNet = false; 
     envelope.setOutputSoapObject(request); 

     HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
     androidHttpTransport.call(SOAP_ACTION,envelope); 

     result = envelope.getResponse(); 

     if (result instanceof ArrayList<?>) {    
      ArrayList<?> weatherList = (ArrayList<?>)result;     
      for (int i=0; i<weatherList.size(); i++)      
       Object weekDay = weatherList.get(i); 
       System.out.println();     
      } 

     } else { 

     } 

    } catch (SocketTimeoutException e) {    
     Toast.makeText(mainActivity, "Service is not connected, Please make sure your server is running", Toast.LENGTH_LONG).show(); 

    } catch(Exception e) {   
     e.printStackTrace();        
    }  
} //end of callWebService() 

В строке

result = envelope.getResponse(); 

я получить ArrayList как

enter image description here

Но тогда я не знаю, что, как я могу получить данные из списка. После достижения линию

if (result instanceof ArrayList<?>) {..} 

управления передается onPostExecute() метод и здесь я получаю результат нулевой. Как я могу заполнить данные после получения результата из ArrayList. Также, как я пытаюсь заполнить данные в методе callwebService. Как я могу получить ArrayLIst в переменной результата onPostExecute(ArrayList<?> result). Поскольку мой метод возвращает ArrayList, возвращаемый результат переносится на метод onPostExecute() из метода doInBackground(). Также в doInBackground() методы, где я могу проверить isCancel() как

@Override 
protected Void doInBackground(Void... params) {  
    for (int i = 1; i <100; i++) {     
     if (isCancelled()) {     
      break;    
     } else {     
      System.out.println(i);    
      callWebService();         
     } 

    } //end of for()     
    return null;   
} //end of doInBackground() 

Но если я проверить внутри для цикла, то мой callWebService() вызова методы 100 раз. Поэтому в моем случае есть необходимость вызвать метод isCancelled().

Благодаря

+0

'objMyTask.cancel();' и вы можете [проверить его] (http://samir-mangroliya.blogspot.in/p/android-customized-listview.html) –

+0

Одна вещь, которая меня смущает, что моя 'protected ArrayList doInBackground (Void ... params)' return type - это ArrayList, и я возвращаю значение null в методе. Это нормально ? – Basit

+0

У вас есть 'return null;' –

ответ

1

Ваш метод должен быть объявлен как private ArrayList<?> callWebService(), и вы должны вернуть свой массивList из этого метода, когда вы закончите.

Также, как указано выше, вы должны проверить, возвращается ли ваш объект результата как Vector. Если он возвращается в вектор, измените его на ArrayList.

Наконец, в doInBackround вашего AsyncTask вы должны изменить свой return null код для return callWebService(); поскольку ваш метод callWebService() будет возвращать результат ArrayList с помощью данной модификации. Затем в вашем onPostExecute(ArrayList<?> result) переменная результата не будет равна null, но будет иметь результат ArrayList из вашего веб-сервиса.

Так с Бове изменений вы будете иметь что-то вроде этого:

private ArrayList<?> callWebService() { 
...  
try { 

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 
    envelope.dotNet = false; 
    envelope.setOutputSoapObject(request); 

    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
    androidHttpTransport.call(SOAP_ACTION,envelope); 

    result = envelope.getResponse(); 

    if (result instanceof ArrayList<?>) {    
     ArrayList<?> weatherList = (ArrayList<?>)result;     
     for (int i=0; i<weatherList.size(); i++)      
      Object weekDay = weatherList.get(i); 
      System.out.println();     
     } 

    } else { 

    } 

    return result; 

} catch (SocketTimeoutException e) {    
    Toast.makeText(mainActivity, "Service is not connected, Please make sure your server is running", Toast.LENGTH_LONG).show(); 

} catch(Exception e) {   
    e.printStackTrace();        
}  
} //end of callWebService() 

AsyncTask:

public class MyTask extends AsyncTask<Void, Void, ArrayList<?>> { 

ProgressDialog dialog = null; 
Object result = null; 
MainActivity mainActivity; 

public MyTask(MainActivity mainActivity) {  
    this.mainActivity = mainActivity ;   
} 

@Override 
protected void onPreExecute() {  
    super.onPreExecute(); 
    if (dialog == null) {   
     dialog = new ProgressDialog(mainActivity);   
    }   
    dialog.setMessage("Please Wait. Your authentication is in progress");  
    dialog.show();  
} //end of onPreExecute() 

@Override 
protected ArrayList<?> doInBackground(Void... params) {  

    return callWebService();  
} //end of doInBackground() 

@Override 
protected void onPostExecute(ArrayList<?> result) {  
    super.onPostExecute(result); 
    dialog.dismiss(); 
} //end of onPostExecute() 

} //end of class MyTask 

Вы можете изменить свой вектор в список Array, с чем-то вроде этого:

ArrayList<WeekDays> arraylist = new ArrayList<WeekDays>(); 
Collectios.copy(arraylist, vector_containing_the_data); 

Редактировать (Basit) --------- -------------------------------------------------- ----

@Override 
protected void onPostExecute(Vector<?> result) { 

    super.onPostExecute(result); 

    if (result != null) { 

     for (int i=0; i<result.size(); i++) { 

      Object weekDay = result.get(i); 

      if (weekDay instanceof SoapObject) { 

       SoapObject weekDayObject = (SoapObject)weekDay; 

       String objectName = weekDayObject.getName(); //WeekDays 
       String dayName = weekDayObject.getProperty("name").toString(); 
       String weather = weekDayObject.getProperty("weather").toString(); 
       String temp = weekDayObject.getProperty("temperature").toString(); 

      } //end of if (weekDay instanceof SoapObject) 

     } //end of for (int i=0; i<result.size();...) 

    } //end of if (result != null) 

    dialog.dismiss(); 

} //end of onPostExecute() 

Но я думаю, что это должно быть сделано в методе doBackGround() и после заполнения значения в компоненте. Затем я должен использовать этот компонент в моем методе onPostExecute(), чтобы обновить UIThread. Но этот код отлично работает для меня.

+0

Хмм, вы хотите сказать, как я использую прямо сейчас ' public ArrayList weatherReport() '. Поэтому вместо использования ''. Я должен использовать здесь ''? Но что не так с общественностью. Есть ли какая-то особая причина, чтобы изменить его на личную. Yup я проверил его с 'if (result instanceof Vector)' и он работает. Но как я могу изменить вектор в ArrayList? – Basit

+0

Я изменил метод, но я получаю ошибку, которая 'не может вернуть результат void'. Вот изменения 'protected ArrayList doInBackground (ArrayList ... params) {\t \t \t return callWebService(); \t \t} // конец doInBackground() ' – Basit

+0

Вы также должны изменить объявление callWebService() с void на ArrayList . – Angelo

0

Ваш объект Результат возвращается в виде вектора, а не в ArrayList.

Попробуйте изменить вещи:

if (result instanceof Vector) {    
      Vector weatherList = (Vector)result; 

и посмотреть, если вы получите в любом месте.