2011-08-01 52 views
1

我知道這種問題存在,但我很困惑在這種情況下。我使用下面的代碼:Android:不能創建處理程序內部線程沒有調用looper.prepare

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

} 

時的位置返回null,並調用yoThereNull()方法時,logcat的說:不能創建內螺紋處理程序尚未調用looper.prepare

但位置返回時一個值,一切都沒關係。出現吐司。

任何人都知道如何處理這個在我的情況?我對java和android有點新鮮,非常感謝任何幫助! :)

回答

6

可以更換

yoThereNotNull(); 

GetALocation2.this.runOnUiThread(new Runnable() { 

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

只需對您的代碼稍作修改,我替換yoThereNotNull();與yoThereNull();它的功能就像一個魅力,非常感謝@PravinCG! :) – Emkey

+0

很高興幫助。我誤解了你遇到的問題。 :) – PravinCG

+0

感謝它爲我工作:) –

0

你必須在此行的一個問題:

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(); 
+0

嗨路易斯,感謝您的回覆,我嘗試過,但我仍然會得到相同的日誌... – Emkey

+0

你可以嘗試使用,而不是這個「GetALocation2.this」?以防萬一它試圖使用'LocationResult'。 – stephendnicholas

+0

我試過,仍然得到相同的... – Emkey

0

當手動創建一個線程另一個線程內等等。這是一個條件的Android無法處理此錯誤出現..這就是爲什麼他們給了一些所謂的AsyncTask,您可以使用在後臺做事情..當這個ecxeption出現時,你不能總是說你的代碼有錯誤。有時你的代碼是乾淨的,但Android OS仍然會拋出這個異常。所以確保使用AsyncTask而不是創建一個Thread自己..

+0

是的,你是正確的傢伙,但我沒有看到他的代碼中的任何線程? –

+0

它也發生時,也有可能會創建線程太麻煩的方法調用.. – ngesh

相關問題