С чего начать асинхронную задачу - Android - PullRequest
1 голос
/ 01 марта 2012

Я все еще изучаю разработку на Java / Android, и мне нужно некоторое руководство для реализации задачи Async.Я в основном не уверен, с чего начать в моей программе.Ниже я изложил некоторый код, может кто-нибудь показать мне, где и как реализовать задачу?Мое приложение отправляет координаты GPS в базу данных каждую секунду, и мне нужно отдельное задание, чтобы я не увязал в главном потоке и не рисковал ошибкой ARN.Вот мой код:

Этот первый блок относится к моей основной деятельности.Когда кнопка нажата, начинается трехсекундный обратный отсчет, и когда он завершается (onFinish), пользовательские данные отправляются в одну базу данных (SendUserActivity.sendId..., это фактически класс, а не действие, просто плохо названное) и приложениезатем начинает отслеживать пользователя и отправлять координаты в другую базу данных каждую секунду (location.startLocation...) (две базы данных, чтобы избежать повторения всех данных пользователя).

MainActivity.java:

public void onFinish() {
   button.setText("SENT");  
   SendUserActivity.sendId(usr_id1, first, last);                   
   location.startLocation(getBaseContext(), usr_id1);

Это второй блок кода из класса LocationActivity (также это класс, а не действие, опять плохое наименование).Он запрашивает обновление местоположения каждую секунду, а затем отправляет его в сценарий PHP, который вставляет его в базу данных MySQL.

public class LocationActivity {

    private LocationManager locManager;
    private LocationListener locListener;

    public void startLocation(Context context, String usr_id2)
    {   
        final String usr = usr_id2;

    //get a reference to the LocationManager
    locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);


    //checked to receive updates from the position
    locListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            send(location, usr);
        }
        public void onProviderDisabled(String provider){
            //labelState.setText("Provider OFF");
        }
        public void onProviderEnabled(String provider){
            //labelState.setText("Provider ON ");
        }
        public void onStatusChanged(String provider, int status, Bundle extras){
            //Log.i("", "Provider Status: " + status);
            }
        };
        locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locListener);
    }

    public void send(Location loc, String usr_id2) {

         Log.i("", String.valueOf(loc.getLatitude() + " - " + String.valueOf(loc.getLongitude())));

         String lat = String.valueOf(loc.getLatitude()); 
         String lon = String.valueOf(loc.getLongitude());

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://example.com/test/example.php");

         try {
           List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
           nameValuePairs.add(new BasicNameValuePair("lat", lat)); 
           nameValuePairs.add(new BasicNameValuePair("lon", lon));
           nameValuePairs.add(new BasicNameValuePair("id", usr_id2));
           httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
           httpclient.execute(httppost);
         } 
         catch (ClientProtocolException e) {
             // TODO Auto-generated catch block
         } 
         catch (IOException e) {
             // TODO Auto-generated catch block
         }
    }
}

Чтобы повторить мой вопрос, как мне реализовать асинхронную задачу для отправки информации GPS в базу данных?Я читал об IntentServices, но некоторые предлагали использовать асинхронную задачу.В любом случае, дайте мне знать, где и как реализовать один из них;Я действительно ценю это.Спасибо!

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

В этом случае вы в основном переносите свой метод send в метод doInBackground() asynctask, и результат в onPostExecute(...) будет установлен в БД.Сделайте AsyncTask внутренним классом, если хотите.Есть много примеров того, как сделать AsyncTask.Вот, например, просто вопрос

Использование AsyncTask с базой данных и

Экземпляр AsyncTask для Android и БД SQLite .

На этом сайте есть очень хорошие учебники http://www.vogella.de/articles/AndroidPerformance/article.html

и, конечно же, Марка Мерфи (CommonsWare) https://github.com/commonsguy/cw-lunchlist/blob/master/15-Internet/LunchList/src/apt/tutorial/FeedActivity.java


Приветствия

1 голос
/ 01 марта 2012

Я думаю, что «GPS-коллектор» больше подходит для Сервиса.

Ваш сервис может выглядеть так:

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Binder;
import android.os.Bundle;
import android.os.IBinder;

public class GPSCollectService extends Service implements LocationListener{
private LocationManager mLocationManager;

public class GPSBinder extends Binder {
    GPSCollectService getService() {
        return GPSCollectService.this;
    }
}

@Override
public IBinder onBind(Intent intent) {
    return mBinder;
}

private final IBinder mBinder = new GPSBinder();

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_STICKY;
}

@Override
public void onCreate() {
    startservice();
}

@Override
public void onDestroy(){
    mLocationManager.removeUpdates(this);
    mLocationManager = null;
}

private void startservice() {
    mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);   
}

public void onLocationChanged(Location arg0) {
    if (arg0 != null){
        //Your database storing code here
        }
    }

public void onProviderDisabled(String arg0) {}
public void onProviderEnabled(String arg0) {}
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {}
}

и в вашей основной деятельности:

private Intent msvcGPSCollect = null;

@Override
public void onDestroy(){
    finishServices();

    super.onDestroy();
}

private void startBackgroundServices(){
    msvcGPSCollect = new Intent(this, GPSCollectService.class);
    startService(msvcGPSCollect);
}

private void finishServices(){
    if (msvcGPSCollect != null)
        stopService(msvcGPSCollect);
}

РЕДАКТИРОВАТЬ: Я на самом деле не ответил на ваш вопрос!

Где я положил:

\\ Your database storing code here

вам нужно будет вызвать собственную асинхронную задачу.

Пример вызова асинхронной задачи:

PushGPSAsync myAsyncTask = new PushGPSAsync();
myAsyncTask.execute();

Пример асинхронной задачи:

public class PushGPSAsync extends AsyncTask<Void, Void, Boolean>{
    @Override
    protected Boolean doInBackground(Void... params){
        pushGPS();
        return null;
    }

    @Override
    public void onPostExecute(Boolean result){
        //Call a post execute function here
    }
}

private boolean pushGPS(Void... params){
    //store the GPS
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...