Android 螺纹,可';t在未调用looper.prepare的线程内创建处理程序
我在尝试调用时遇到“无法在未调用looper.prepare的线程内创建处理程序”错误 LocationManager.RequestLocationUpdate(LocationManager.GPS\提供程序,0,0,LocalListener) 但是,如果我不在线程内调用它(run()),它就可以正常工作。我该怎么办 编辑: MyAlarmService.javaAndroid 螺纹,可';t在未调用looper.prepare的线程内创建处理程序,android,multithreading,location,handler,looper,Android,Multithreading,Location,Handler,Looper,我在尝试调用时遇到“无法在未调用looper.prepare的线程内创建处理程序”错误 LocationManager.RequestLocationUpdate(LocationManager.GPS\提供程序,0,0,LocalListener) 但是,如果我不在线程内调用它(run()),它就可以正常工作。我该怎么办 编辑: MyAlarmService.java private Handler handler = new Handler(){ @Override pub
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
System.out.println("Handle MSGGGGGGGGGG");
}
};
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
super.onStart(intent, startId);
WorkerThreads WT1 = new WorkerThreads("Thread1");
WorkerThreads WT2 = new WorkerThreads("Thread2");
WT1.start();
WT2.start();
}
class WorkerThreads extends Thread{
public WorkerThreads(String string) {
// TODO Auto-generated constructor stub
super(string);
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
if(getName().equals("Thread1")){
System.out.println("MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM");
GetAlarmCoordinates gcc = new GetAlarmCoordinates();
gcc.init(getApplicationContext(),handler);
/*try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
System.out.println(MyAlarmService.currentLatLon[0] + " " + MyAlarmService.currentLatLon[1] );
}else if(getName().equals("Thread2")){
}
}
}
GetAlarmCoordinates.java
public void init(Context cont, Handler handler){
mHandler = handler;
locManager = (LocationManager) cont.getSystemService(Context.LOCATION_SERVICE);
onClick();
}
public void onClick() {
// progress.setVisibility(View.VISIBLE);
// exceptions will be thrown if provider is not permitted.
System.out.println("GetCurrentLocation");
try {
gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch (Exception ex) {
}
try {
network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch (Exception ex) {
}
System.out.println("gps_enabled : "+gps_enabled+ " network_enabled : "+network_enabled);
if (gps_enabled) {
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
}
if (network_enabled) {
locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);
}
}
class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
if (location != null) {
// This needs to stop getting the location data and save the battery power.
locManager.removeUpdates(locListener);
//locationManager.requestLocationUpdates(GPS_PROVIDER, intervall, distance, listener);
latitude = location.getLatitude();
londitude = location.getLongitude();
MyAlarmService.currentLatLon[0] = latitude;
MyAlarmService.currentLatLon[1] = londitude;
System.out.println("Alarm Coodinates lat : "+latitude+" lon : "+londitude);
mHandler.sendEmptyMessage(0);
//notify();
}
}
您可以使用
Activity.runOnUiThread()
方法来避免此异常,下面是代码段:
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
}
});
希望这有帮助。我猜是
locManager.requestLocationUpdates(LocationManager.GPS\u PROVIDER,0,0,locListener)代码>必须在UI线程中运行
解决方案:
只需在UI线程中运行它,而无需创建新线程
如果你正在跑步
`locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);`
从另一个类中,然后可以通过活动实例运行代码:
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// Your code
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locListener);
}
});
我希望这有帮助。您可以在上下文中使用getMainLooper
,
只需将上下文作为参数和用户链接发送到类
locationManager.requestLocationUpdates(getProviderName(), time, meter, locationUpdateListener,context.getMainLooper());
埃戈尔的回答是正确的。原因是你不能在非UI线程中执行这样的操作。我有一个BG服务,每5分钟调用一次,当警报被调用时,我需要做两件事。检查麦克风的噪音并检查位置。所以我创建了两个线程并调用了函数。那么只有这个错误发生了..在这种特殊情况下怎么做?你唯一能做的就是在主线程中调用它,而不是自己创建一个。但是如果您必须创建一个线程,那么您可以使用Egor提供的方法在UI线程中运行它,或者使用处理程序并使用sendMessage()传递结果;您可以展示一些在线程中使用处理程序的示例吗。我在另一节课上查位置。从我称之为类的线程。。谢谢你的快速回复,我在服务中使用这个?没有UI线程。。