2016-01-10 121 views
0

我在Android上的线程没有正确运行。 我开始从一个服务,但为什么它没有正确运行。Android线程未在后台运行

服务:

ServiceHelper sh = new ServiceHelper(); 
new Thread(sh).start(); 

public class ServiceHelper implements Runnable { 
    public void run() { 
     while(true) { 
      Log.d(LOG_TAG, "run"); 
      //1.) sometimes it calls this here: SSLSocket.close(); 
      //2.) also, sometimes it calls a write operation on this SSLSocket. 
      // but since write can block, I've put this write operation inside an AsyncTask: new WriteAsyncTask().execute(somethingToWrite); 
      // This returns immediately. 
      Thread.sleep(1000); 
     } 
    } 
} 

,这导致logcat的是这样的:

01-10 22:39:54.148 I/TEST(10327): run 
01-10 22:40:04.150 I/TEST(10327): run 

因此,有像10秒错过这个线程。 为什么会发生这种情况? 当然还有其他线程可以阻止网络操作。 但是为什么这个特定的线程没有运行?

我还注意到一个很奇怪的事情:

public void run() { 
    while(true) { 
     Log.i(LOG_TAG, "tick1"); 
     Thread.sleep(1000); 
     Log.i(LOG_TAG, "tick2"); 
    } 
} 

并不知我得到这个在日志中:

01-11 22:06:54.649 I/BGService(10078): tick1 
01-11 22:07:50.664 I/BGService(10078): tick2 

tick1之间和tick2有一个且只有一个操作:的Thread.sleep (1000)。它几乎可以阻塞一分钟? 这是在一个线程,它是从一个服务启动,但是这个巨大的延迟的主要原因是什么?

+1

有没有在你的代码有什么用线程。 – CommonsWare

+0

好的,我只是想告诉你一个非常基本的减少我的应用程序。但是,每秒钟将消息打印到logcat中的线程看起来都是一样的。 – Daniel

+0

因此,为了更多浏览,似乎SSLSocket.close()可以阻止整个步骤。 – Daniel

回答

1

确保选中确保您运行的Runnable像这样:

Thread t = new Thread(new ServiceHelper()); 
t.start(); 

只有这样,它与作为一个线程启动。

在附注中,您正在做的是运行无限循环,这将占用100%的CPU使用量。 Android可能会杀死或严重限制您的服务以允许其他服务正常运行。

+0

我纠正了这个问题,对不起。当然,原来里面有一个睡眠。 – Daniel

+0

在这10秒内,日志中是否发生过任何有趣的事情?很多时候,Android会在内存不足时重新启动服务。 –

+0

不,这两者之间没有一条线。我知道关于Android的服务重启事情。但我的服务记录了它的启动,并且不在这些线路之间显示,所以不是这种情况。 – Daniel

-1

里面的while循环使用这样的事情,你会看到结果

Thread.sleep(1000);