2014-02-06 44 views
0

我正在測試一些處理程序的東西,並且我遇到了以下問題,設計了類本身,我覺得沒有多大意義(將活動的上下文傳遞給構造函數其他課程又擴展了Thread),但我認爲它可以從「學術」角度來看有用。關於Android中的活動上下文和處理程序

所以我有兩個類 - 第一個是活動,第二個擴展線程,第二個類將傳遞一些數據到活動的想法,我做了一個構造函數,將從這兩個處理程序該活動的活動和背景

PS。我發現,當我嘗試通過Location對象參數問題實際上只出現時,編輯的代碼:

活動部分:

public class MainActivity extends Activity { 





public static final String content="Asega kvo stava"; 
public static final Integer kom=2; 
Context m; 


private Handler nok; 
Location loc; 

String TAG="TAG"; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    nok=new Handler() { 

    public void handleMessage(Message msg) 


    { 





     Log.d(TAG, "msg: " + msg); 
     Bundle m=msg.getData(); 




     } 



    }; 


     new locac(nok,this).start(); 

,這裏是另一類

public class locac extends Thread implements LocationListener{ 

public static Context Ctx; 
private final Handler nok; 
     LocationManager norm; 

public static String moi="manag.GPS_PROVIDER"; 


public locac (Handler h, Context k){ 


    nok=h; 
    Ctx=k; 


} 


..... 

public void run() 


{ 
    norm=(LocationManager)Ctx.getSystemService(Ctx.LOCATION_SERVICE); 
    norm.requestLocationUpdates(norm.GPS_PROVIDER, 0, 0, this); 
    Location oko=norm.getLastKnownLocation(norm.GPS_PROVIDER); 


      int lato=(int)oko.getLatitude(); 


    Message message=new Message(); 
       Bundle bok=new Bundle(); 


     int beta=145; 

      bok.putInt("tok",lato); 
      bok.putInt("toke",beta); 
      message.setData(bok); 
     nok.sendMessage(message) ; 
    } 

現在,如果我嘗試編譯那一個,它會給我以下消息

java.lang.RuntimeException: Can't create handler inside thread that has not called 
    Looper.prepare() 
at android.os.Handler.<init>(Handler.java:197) 
at android.os.Handler.<init>(Handler.java:111) 

i F I刪除Locac的構造的情況下部分,並留下它只是

public locac (Handler h){ 


    nok=h; 

} 

,然後只是初始化 - 新locac(NOK)。開始();在活動類,然後它工作正常 我無法計算爲什麼調用線程內的上下文給Looper消息,更詳細的解釋將不勝感激(用於學習的目的也)

回答

1

以防萬一有人有興趣,原來,問題的來源是requestLocationUpdates,它調用LocationListener的對象,這反過來又調用OnChangedLocation得到更新

,如果我們看一下LocationManager.java

public void onLocationChanged(Location location) { 
     Message msg = Message.obtain(); 
     msg.what = TYPE_LOCATION_CHANGED; 
     msg.obj = location; 
     mListenerHandler.sendMessage(msg); 
    } 

這意味着onLocationChanged調用mListenerHandler,因此套口的短信..

0

如果您更換您的MainActivity new locac(nok,this).start();new locac(nok,MainActivity.this);您不會收到錯誤,因爲當您使用這個時,您指的是線程對象而不是MainActivity對象。 你不能傳遞一個線程對象到一個線程

+0

這是不對的,採用t他在MainActivity的範圍內指的是MainActivity.this。 – ElDuderino

+0

是的,我也嘗試MainActivity.this,相同issue.I編輯原始帖子,因爲它會變成問題實際上出現時,當我嘗試通過位置對象的方式 –