创建新主题 - Android

时间:2012-02-28 14:26:20

标签: java android multithreading gps looper

我正在尝试实现一个looper,因此我可以创建一个线程来将GPS坐标发送到数据库。我是Java的新手,这一切都让人感到困惑,但也许你可以提供帮助。按下按钮时,主活动将调用以下类方法。该方法找到GPS位置,然后将其发送到不同类的方法,该方法将纬度和经度(以及用户ID)发送到数据库。我的应用程序有时会慢下来并冻结,所以看来我需要实现一些方法来为这个过程创建一个新的线程。有任何想法吗。我是个菜鸟,所以要温柔。这是我的代码:

    public class LocationActivity extends Thread{

    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) {
            SendActivity.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);
            }
        };

        Looper looper = null;
        locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener, looper);
    }
}

另外一个问题,我会在这里或实际将信息发送到数据库的类中添加looper吗?它使用HTTP Post发送到PHP程序,该程序将信息添加到MySQL数据库。

3 个答案:

答案 0 :(得分:4)

我很想在这里尝试不同的策略。 Android有一个名为AsynTask的类,用于减轻开发人员在线程上卸载工作的负担。

  

AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

在写入数据库并将数据发送回服务器方面,我会考虑使用Service,但请记住,唯一不在UI线程上本机运行的服务是{{ 3}}

答案 1 :(得分:1)

您应该考虑使用AsyncTask类进行此类操作,它非常易于使用,它提供了一种与UI线程同步的简单方法。 Here's关于Android中线程的好文章,您可以在Android文档中详细了解AsyncTask。希望这会有所帮助。

答案 2 :(得分:0)

您无法从自定义线程访问“上下文”或任何UI对象。这是因为它们是在主UI线程中创建的,您无法从线程中访问这些对象。

正如Martyn所说,你需要创建一个AsyncTask或使用Handlers来访问context / ui。

在您的情况下,请转到AsyncTask