Помогите разобраться со следующей проблемой: запуск AsyncTask по определенному расписанию.
Т.к. изучением разработки под Android занялся буквально месяц назад, а задача стоит вполне конкретная, буду рад любым комментариям, которые помогут разобраться в вопросе.
Собственно теперь некоторое количество информации, на основе которой будет проще понять, что же хочется реализовать.
Исходные данные.
Есть удаленный ресурс, предоставляющий по запросу информацию о положении на мировой карте устройств, размещенных на транспорте (транспорт курсирует по постоянному маршруту). Данная информация обновляется на стороне ресурса 1 раз в минуту.
Необходимо.
Если приложение запущено, получить информацию о местоположении устройств на текущий момент и, с определенной периодичностью, обновлять ее. Информация выводится в виде маркеров на карте, собственно при обновлении они просто перемещаются в новые позиции, полученные с удаленного ресурса.
В каком направлении я двигался.
Дойдя в изучении по урокам до AsyncTask, я понял, что мне это подойдет. И, в принципе, все удалось решить (получение данных из сети при запуске, показ на карте), кроме обновления информации с некоторой периодичностью.
В текущем проекте код для работы выглядит так.
1. MainActivity
Код: Выделить всё
public class MainActivity extends FragmentActivity {
...
private AsyncTimer transportTimer;
...
@Override
public void onDestroy(){
transportTimer.unLink();
super.onDestroy();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
...
getShuttle();
transportTimer = new AsyncTimer(MainActivity.this);
transportTimer.execute(GET_TRANSPORTS,"60000");
}
// Данный метод запускает AsyncTask, обновляющий положение устройств на карте
public void getShuttle(){
Log.d(APP_LOG_TAG,"get shuttle");
new RequestTask().execute(URL,GET_TRANSPORTS);
}
}
Код: Выделить всё
class RequestTask extends AsyncTask<String, String, String> {
...
String task = "";
String jsonResult = "";
@Override
protected String doInBackground(String... params) {
task = params[1];
Log.d(APP_LOG_TAG,"Start task "+task);
try {
DefaultHttpClient hc = new DefaultHttpClient();
ResponseHandler<String> res = new BasicResponseHandler();
HttpPost postMethod = new HttpPost(params[0]);
postMethod.setHeader("X-Requested-With", "XMLHttpRequest");
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);
switch(task){
...
case GET_TRANSPORTS:
nameValuePairs.add(new BasicNameValuePair("task", "getLastTrackingM"));
break;
...
}
postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));
jsonResult = hc.execute(postMethod, res);
} catch (Exception e) {
e.printStackTrace();
}
return jsonResult;
}
@Override
protected void onPostExecute(String strJson) {
...
switch(task){
...
case GET_TRANSPORTS:
try {
... // Изменение положения маркеров на карте в соответствии с новыми координатами
} catch (JSONException e) {
// TODO Auto-generated catch block
Log.e("log_tag", "Error parsing data " + e.toString());
}
Log.d(NET_LOG_TAG, strJson.toString());
break;
...
}
super.onPostExecute(strJson);
}
}
Код: Выделить всё
static class AsyncTimer extends AsyncTask<String, Void, Void>{
private int Tick = 1000;
private String TaskName;
private MainActivity parentHandler;
AsyncTimer (MainActivity H){
parentHandler = H;
}
void unLink() {
parentHandler = null;
}
@Override
protected Void doInBackground(String... params) {
TaskName = params[0];
if(params.length>1){
Tick = Integer.parseInt(params[1]);
}
while (parentHandler!=null)
{
publishProgress();
try{
Thread.sleep(Tick);
} catch (Exception xx){
xx.toString();
}
}
// TODO Auto-generated method stub
return null;
}
protected void onProgressUpdate(Void... values) {
switch(TaskName){
case GET_TRANSPORTS:
// Вызов метода, обновляющего положение на карте.
parentHandler.getShuttle();
break;
}
}
}
Может быть, выбранный вариант попробовать заменить на связку AsyncTask -> Service ? Т.е. класс RequestTask сделать отдельным сервисом, и запрашивать у него данные из AsyncTimer с нужной периодичностью?
Я думаю, данную задачу можно решить несколькими способами, но пока моих знаний не хватает, что бы сделать это.