gpt4 book ai didi

java - 关于android中的 Activity 上下文和处理程序

转载 作者:行者123 更新时间:2023-12-01 13:30:26 24 4
gpt4 key购买 nike

我正在使用处理程序测试一些东西,并且遇到了以下问题,我认为类本身的设计没有多大意义(将 Activity 的上下文传递给另一个类的构造函数,而另一个类又扩展了Thread ),但我认为从“学术”的角度来看它可能很有用。

所以我有两个类 - 第一个是 Activity ,第二个扩展了 Thread ,第二个类将向 Activity 传递一些数据,并且我创建了一个构造函数,它将从 Activity 和该 Activity 的上下文

PS。我发现这个问题实际上只有当我尝试传递位置对象参数时才会出现,编辑了代码:

Activity 部分:

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)

如果我删除 Locac 构造函数的上下文部分,并保留它

public locac (Handler h){


nok=h;

}

然后用 - new locac(nok).start(); 初始化它在 Activity 类中,那么它工作正常我不明白为什么在线程类中调用上下文会给出 Looper 消息,更详细的解释将不胜感激(也用于学习目的)

最佳答案

以防万一有人感兴趣,事实证明问题的根源是 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 调用 mLListenerHandler 并因此调用循环消息..

关于java - 关于android中的 Activity 上下文和处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21600558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com