2012-03-01 68 views
1

我仍然在学习Java/Android开发,我需要一些指导来实现异步任务。我主要不确定在我的程序中从哪里开始。我在下面概述了一些代码,有人可以告诉我在哪里以及如何执行任务?我的应用程序每秒都会将GPS坐标发送到数据库,并且我需要一个单独的任务,所以我不会阻塞主线程并冒ARN错误的风险。这是我的代码:从哪里开始异步任务 - 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 
     } 
    } 
} 

重申我的问题,我将如何实现一个异步任务发送GPS信息到数据库?我已阅读IntentServices,但有人建议我使用异步任务。无论哪种方式,让我知道在哪里以及如何实现其中之一;我真的很感激它。谢谢!

+0

需要等待外部系统,外线电话需要在基本异步一切。你的情况是send()需要异步。 – Rudy 2012-03-01 10:41:46

回答

3

在这种情况下,基本上你会将发送方法包装到asynctask的doInBackground()方法中,并且将onPostExecute(...)中的结果设置为DB。如果你喜欢,使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 2012-03-01 10:50:01

+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 – 2012-03-01 10:54:22

+0

此外,由于每秒都会调用send方法,每次都会创建一个新任务吗? – mkyong 2012-03-01 10:56:37

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); 
} 

编辑:我没有真正回答您的问题!

当我把:

\\ 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 
}