关于android中的活动上下文和处理程序

时间:2014-02-06 10:43:11

标签: java android

我正在使用处理程序测试一些东西,我遇到了以下问题,设计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消息,更加详细的解释将非常感激(也用于学习目的)

2 个答案:

答案 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 对象。 并且您无法将线程对象传递给线程