Android: невозможно создать обработчик внутри потока, который не вызвал Looper.prepare () - PullRequest
1 голос
/ 03 сентября 2011

Я пытаюсь запустить следующее, но получаю ошибку

Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare ()

Вот мой код

private static void getLocations()
{   
    try
    {       
        m_locationManager = (LocationManager)activity.getSystemService(Context.LOCATION_SERVICE);           
        m_locationListener = new LocationListener() {
            public void onLocationChanged(Location location) 
            {
                Log.d("Output", "onLocationChanged");
            }

            public void onStatusChanged(String provider, int status, Bundle extras) 
            {
                Log.d("Output", "onStatusChanged");
            }

            public void onProviderEnabled(String provider) 
            {
                Log.d("Output", "onProviderEnabled");
            }

            public void onProviderDisabled(String provider) 
            {
                Log.d("Output", "onProviderDisabled");
            }
        };

        m_locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 1000, m_locationListener);
        Log.d("Output", "done");

    }
    catch(Exception ex)
    {
        Log.d("Output", ex.getMessage());
    }

}

Если я поставлю Looper.prepare() перед requestLocationUpdates(), ошибка исчезнет, ​​но события не будут запущены.

Если я затем поставлю Looper.loop() после requestLocationUpdates(), то он приостанавливается, и журнал "done" не вызывается.

Если, если вызвать функцию в runOnUiThread, то так:

activity.runOnUiThread(new Runnable() {
    public void run() 
    {
        getLocations(); 
    }
});

события не запускаются.

Я использую его как плагин для игрового движка Unity, поэтому у меня нет прямого доступа к основному потоку.

Я попытался запустить этот код вне Untiy, и он работает нормально.

Я застрял на этом, поэтому любая помощь будет признательна.

Приветствия


Обновление:

Итак, я сейчас пытаюсь получить местоположения внутри отдельного занятия. Однако события до сих пор не называются.

public class LocationActivity extends Activity implements LocationListener
{
    private LocationManager m_locationManager;

    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        LinearLayout content = new LinearLayout(this);
        content.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        content.setOrientation(LinearLayout.VERTICAL);
        content.setBackgroundColor(Color.TRANSPARENT);

        TextView infoLabel = new TextView(this);
        infoLabel.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        infoLabel.setTextSize(20.0f);
        infoLabel.setText("Initializing...");
        content.addView(infoLabel);

        try
        {
            m_locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

            String provider = null;

            if (m_locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER)) 
            {
                provider = LocationManager.GPS_PROVIDER ;
                Log.d("Unity", "Using GPS");
                m_locationManager.requestLocationUpdates(provider, 1000, 100, this);
            } 
            else if(m_locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) 
            {
                provider = LocationManager.NETWORK_PROVIDER;
                Log.d("Unity", "Using Netword");
                m_locationManager.requestLocationUpdates(provider, 1000, 100, this);
            } 
            else 
            {
                Log.d("Unity", "Provider Not available");
            }       
        }
        catch(Exception ex)
        {
            Log.d("Unity", "locatons error " + ex.getMessage());
        }

        setContentView(content);
    }

    public void onLocationChanged(Location location) 
    {
        Log.d("Unity", "UserLocation Lat:" + location.getLatitude() + " Long:" + location.getLongitude());
    }

    public void onStatusChanged(String provider, int status, Bundle extras) 
    {
        Log.d("Unity", "onStatusChanged");
    }

    public void onProviderEnabled(String provider) 
    {
        Log.d("Unity", "onProviderEnabled");
    }

    public void onProviderDisabled(String provider) 
    {
        Log.d("Unity", "onProviderDisabled");
    }
} 

Вид открывается правильно, и доступны как GPS, так и сеть. По-прежнему нет стрельбы

Я использую эти разрешения

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_GPS" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
<uses-permission android:name="android.permission.INTERNET"/> 

1 Ответ

0 голосов
/ 03 сентября 2011

Попробуйте mView.post(new Runnable() { getLocations() };

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...