现在是这样一个问题,整个程序就一个Activity,它接受GPS信息,第一次获取到位置的时候启动一个后台线程,该线程是包含UDP服务端和客户端,start之后除非调用自定义的方法exit()否则不会退出。而这个exit方法是在Activity的onDestroy()里面调用的。但是目前发现这样的一个问题,就是,按了home键之后,程序执行了onStop()方法,然后点击程序图标此时会执行onCreate()方法,而不是理想中的onStart()方法。这样再获取到位置之后就会报错,我想应该是Activity被系统回收导致重新create了一个,但是后台线程没有退出,导致端口冲突。
而且最郁闷的是按home键的行为并不是每次都一样的,一般开机第一次肯定会是按了home,再点就是onCreate(),以后随机……
用的机器是摩托的mt710,在模拟器上没有这样的问题,在华为U8220上也有类似问题。
现在我想解决这个问题,请问有没有好的办法呢?

解决方案 »

  1.   

    activity被回收,线程应该会关闭的
    添加android:launchMode="singleInstance" 试试。
      

  2.   

    Activity被回收,那么它打开的线程会不会关闭一般的做法是设置标志位好像是这样
      

  3.   

    做下同步,如果onstop了,那就让线程停止
      

  4.   

    现在的情况是如果按了home,会执行onStop(),再点程序图标,这时候当后台线程运行的时候就会出现问题,我想是因为端口冲突,实际上也是这样,因为我把端口设成0之后就不用强制关闭了。
      

  5.   

    onStop()的时候线程不能停止,因为要侦听服务器发送来的信息,还要响应心跳报文。
      

  6.   

    那你可以在onCreate()判断,如果线程是start状态的,就先stop掉,再重新start
      

  7.   

    还有按照常理来说,你按home如果Activity被回收了,也就是整个进程都终止了,应该在这个进程中的线程也会终止的
      

  8.   

    在Activity中开的线程是不会因为Activity的关闭而关闭的。如果你的线程是while(true)循环工作,那么,将true值改成变量控制,要关闭线程,就让变量的值为false,则线程允许即可结束。Java里面线程的结束不能使用stop()方法的,连destroy(),interupt()方法都经常不起作用,并且,这两个方法总会引来多线程问题。所以,对于while(true)执行的线程,通常用改变while条件,来让线程结束运行是最好的方式,不会出错。如果线程不是while(true)执行,那么,线程执行玩所有操作会自动结束的,不用你操心
      

  9.   

    你在onResume里面启动,OnPause里面退出,就没有问题了。如果要一直运行,就做成一个RPC的service吧
      

  10.   

    我的工程里面 Activity 销毁了 但是 那个里面的线程 你不调用关闭方法 线程还是会继续
      

  11.   

    不会关闭,service不就是一个线程吗,如果没有绑定Activity的话就不会因为Activity的关闭而停止--后台听音乐;
      

  12.   

    线程Over
    程序的进程没的关
      

  13.   

    目前的问题是Activity已经销毁了,再起一个Activity能否获取以前的线程的状态?
      

  14.   

    目前就是使用的这样的标志,但是在什么地方来调用改变标志位以中止线程执行呢?本来想的是在Activity销毁的时候执行,但是有时候并不会去执行onDestroy
      

  15.   

     不会停止。
     所以应该处理状态同步。
     建议不要用子线程来做,用 service 。然后用 bindService 的方式来启动服务。在 Activity 退出时,Service 也将被回收。
      

  16.   

    如果需要停掉所有子线程,建议直接杀掉进程
    android.os.Process.killProcess(android.os.Process.myPid());
    目前使用没有发现什么大问题,而且也没有吃内存的情况