2012-03-01 3 views
1

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

Этот первый блок из моего основного вида деятельности. Когда кнопка нажата, запускается трехсекундный обратный отсчет, и когда он заканчивается (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 
     } 
    } 
} 

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

+0

в основном все, что нужно ждать внешней системы, вне телефон должен быть в Async. Для вашего случая нужно отправить send() в async. – Rudy

ответ

3

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

Using AsyncTask with database и

Android AsyncTask and SQLite DB instance.

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

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


Приветствия

+0

Должен ли я иметь целую задачу для класса «LocationActivity»? – mkyong

+0

не очень, но все еще можно проверить здесь http://about-android.blogspot.com/2010/04/find-current-location-in-android-gps.html ... и здесь http://stackoverflow.com/ вопросы/8253887/how-to-excute-asynctask-inside-onlocationchanged-method-in-android и проверьте это. Я предполагаю, что это ваш идеальный случай: //stackoverflow.com/questions/7617957/should-i-create -service-for-gps-tracking-app –

+0

Кроме того, поскольку метод send вызывается каждую секунду, это создаст новую задачу каждый раз? – mkyong

1

Я думаю, что "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); 
} 

EDIT: Я на самом деле не ответил на ваш вопрос!

Где я поставил:

\\ Your database storing code here 

вам нужно вызвать свой собственный Async Task.

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

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 
}