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

Я знаю, что такие вопросы существуют, но я запутался в этом случае.Я использую следующий код:

package com.example.GetALocation2;

import com.example.GetALocation2.MyLocation.LocationResult;

import android.app.Activity;
import android.location.Location;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

public class GetALocation2 extends Activity {
    public static final String LOG_TAG = "------------------GetALocation2";
    Double latitude;
    TextView tv;
    MyLocation myLocation = new MyLocation();

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv = (TextView) this.findViewById(R.id.thetext);
        tv.setText("Yo there!");

        Log.e(LOG_TAG, "Toast will be shown");
        Toast.makeText(getBaseContext(), "This is the start!", Toast.LENGTH_SHORT).show();
        Log.e(LOG_TAG, "Toast was shown");
        locationClick();
    }


    private void locationClick() {
        Log.e(LOG_TAG, "Triggered location click");
        myLocation.getLocation(this, locationResult);
    }

    public void yoThereNull(){
        Toast.makeText(getBaseContext(), "Location is unknown.", Toast.LENGTH_SHORT).show();    
    }

    public void yoThereNotNull(){
        Toast.makeText( getBaseContext(), "I got the location! Yeah! >>> " + GetALocation2.this.latitude, Toast.LENGTH_SHORT).show();
    }


    public LocationResult locationResult = new LocationResult(){
        @Override
        public void gotLocation(final Location location){
            //Got the location!
            Log.d(LOG_TAG, "Entered gotLocation()");
                try{

                    if( location == null ){
                        Log.d( LOG_TAG, "Null Location is returned" );
                        yoThereNull();

                    }else{
                        Log.d( LOG_TAG, "A location is found/returned" );
                        GetALocation2.this.latitude = location.getLatitude();
                        yoThereNotNull();
                    }
                }catch (NullPointerException e) {
                    Log.e(LOG_TAG, e.toString());
                }catch(Exception e){
                    Log.e(LOG_TAG, e.toString());
                }  
            };
    };

}

, когда location возвращает null и вызывает метод yoThereNull (), logcat говорит: не могу создать обработчик внутри потока, который не вызвал looper.prepare

но когда location возвращает значение, все в порядке.появляются тосты.

Кто-нибудь знает, как справиться с этим в моем случае?Я новичок в Java и Android, большое спасибо за любую помощь!:)

Ответы [ 3 ]

6 голосов
/ 01 августа 2011

Можете ли вы заменить

yoThereNotNull();

с

GetALocation2.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    yoThereNotNull();
                }
            });
0 голосов
/ 01 августа 2011

Эта ошибка возникает, когда вы вручную создаете поток внутри другого потока и т. Д. Это одно условие, с которым Android не может справиться. Именно поэтому они дали что-то под названием AsyncTask, которое вы можете использовать для выполнения каких-либо действий.в фоновом режиме ... когда возникает такое исключение, вы не всегда можете сказать, что в вашем коде есть ошибка ... иногда ваш код чист, но ОС Android все равно выдает это исключение .. Поэтому убедитесь, что вы используете AsyncTask вместо того, чтобы создавать поток самостоятельно..

0 голосов
/ 01 августа 2011

У вас есть проблема в этой строке:

Toast.makeText( getBaseContext(), "I got the location! Yeah! >>> " + GetALocation2.this.latitude, Toast.LENGTH_SHORT).show();

Попробуйте использовать упражнение.

Toast.makeText( this, "I got the location! Yeah! >>> " + GetALocation2.this.latitude, Toast.LENGTH_SHORT).show();
...