我正在尝试实现一个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数据库。
答案 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