我正在使用处理程序测试一些东西,我遇到了以下问题,设计og类本身我认为没有多大意义(将活动的上下文传递给另一个类的构造函数,这反过来扩展线程),但我认为从“学术”的角度来看它可能是有用的。
所以我有两个类 - 第一个是活动,第二个是扩展Thread,第二个类将一些数据传递给活动,我做了一个构造函数,它将从两个处理器中获取活动和该活动的背景
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)
如果我删除了Locac的构造函数的上下文部分,并将其保留为
public locac (Handler h){
nok=h;
}
然后用 - new locac(nok).start()初始化它。在Activity类中,它工作正常 我无法理解为什么调用线程类中的上下文给出了Looper消息,更加详细的解释将非常感激(也用于学习目的)
答案 0 :(得分: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,因此调用looper消息..
答案 1 :(得分:0)
如果您使用new locac(nok,this).start();
替换MainActivity new locac(nok,MainActivity.this);
,则不会收到错误,因为当您使用 this 时,您指的是线程对象,而不是< b> MainActivity 对象。
并且您无法将线程对象传递给线程