Я новичок в 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 как
Но тогда я не знаю, что, как я могу получить данные из списка. После достижения линию
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().
Благодаря
'objMyTask.cancel();' и вы можете [проверить его] (http://samir-mangroliya.blogspot.in/p/android-customized-listview.html) –
Одна вещь, которая меня смущает, что моя 'protected ArrayList > doInBackground (Void ... params)' return type - это ArrayList, и я возвращаю значение null в методе. Это нормально ? – Basit
У вас есть 'return null;' –