Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 螺纹,可';t在未调用looper.prepare的线程内创建处理程序_Android_Multithreading_Location_Handler_Looper - Fatal编程技术网

Android 螺纹,可';t在未调用looper.prepare的线程内创建处理程序

Android 螺纹,可';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

我在尝试调用时遇到“无法在未调用looper.prepare的线程内创建处理程序”错误

LocationManager.RequestLocationUpdate(LocationManager.GPS\提供程序,0,0,LocalListener)

但是,如果我不在线程内调用它(run()),它就可以正常工作。我该怎么办

编辑: MyAlarmService.java

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线程。。