activity 启动的时候 用“startService(new Intent(this, mService.class));”启动一个Service
同时 显示一个ListView。Service中 private Runnable run = new Runnable() { @Override
public void run() {
                       //从sd卡读取文件的方法沈略(读取sd卡花费多长时间,ListView就看多长时间)
                        handler.postDelayed(run, 5000);//这里设置的的5秒钟,也就是下面activity打嗝问题的周期
                        }
                };然后在Service中的onStart里面  th = new Thread(run);
              th.run();结果是在拖动ListView时,每隔5秒钟 就卡一下。给位给些指点,分析分析到底是哪里出了问题,是多线程没用对,还是IO阻塞?

解决方案 »

  1.   

    然后在Service中的onStart里面 th = new Thread(run);
    th.run();
    启动线程是用th.start(),run只是调用th的run方法,不会开辟一个线程。
      

  2.   

    handler.postDelayed(run, 5000);//这里设置的的5秒钟,也就是下面activity打嗝问题的周期
    这个是干嘛用的?
    你已经再thread中执行了run对象,不需要再次执行了吧?
      

  3.   


    我是想让Runnable 每过五秒钟循环执行的!
      

  4.   

    handler.postDelayed()可不是多线程啊,执行还是在主线程中,所以你的这个handler用错了
      

  5.   

    handler.postDelayed(run, 5000);
    handler是那个? th的?还是ui thread的?如果是ui thread的,那肯定就会出现你说的问题了。
      

  6.   

    如果你要在你的service的thread中使用handle,那么你要继承handlethread这个类去写,并且在这个thread里面去申请一个handler出来,然后用这个handler去post。
    大致的代码如下:
    Handler m_handler=null;
    HandlerThread m_thread = new HandlerThread("PowerManagerService") {
                protected void onLooperPrepared() {
                           m_handler=new Handler();
                           m_handler.postDelayed(run, 5000);
                }
            };
            mHandlerThread.start()
      

  7.   

    定义一个内部类:   
     public class MyThread extends Thread {
    private boolean running = false;
    public void run() {
    running = true;
    while (running) {
                                 yourWork();//你想做的事情
         try {
     Thread.sleep(5000);
         } catch (Exception a) {
         }
            }
    public void exitThread() {
    running = false;
    } }
    在activity代码中,或者说在UI线程中,MyThread myThread = new MyThread();myThread.start();就可以了。exitThread()设置线程循环的标志位running无效,退出线程。myThread.exitThread()这样调用就可以了
      

  8.   


    恩,确是应该这样来搞! lz本来的代码还是会跑在主线程中,如果你的handler是定义在主线程中的话。