Emkey
Emkey

Reputation: 5376

Android: cant create handler inside thread that has not called looper.prepare

I know this kind of question exist but I'm confused in this case. I'm using the following code:

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());
                }  
            };
    };

}

when location returns null and call yoThereNull() method, the logcat says: cant create handler inside thread that has not called looper.prepare

but when location returns a value, all is okay. the toast appear.

Anyone knows how to handle this in my case? I'm kinda new to java and android, many thanks for any help! :)

Upvotes: 1

Views: 3705

Answers (3)

PravinCG
PravinCG

Reputation: 7708

Can you replace

yoThereNotNull();

with

GetALocation2.this.runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    yoThereNotNull();
                }
            });

Upvotes: 6

ngesh
ngesh

Reputation: 13501

This error comes when you create a thread manually inside another thread and so on.. This is one condition that Android can't handle.. Thats why they have given something called AsyncTask, which you can use for doin things in Background.. when this ecxeption arrises u cannot always say that you have error in your code.. sometimes your code is clean but still Android OS will throw this Exception.. So make sure to use AsyncTask instead of creating a Thread by yourself..

Upvotes: 0

Luis Ollero
Luis Ollero

Reputation: 383

You have a problem in this line:

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

Try using the activity.

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

Upvotes: 0

Related Questions