2012-01-10 38 views
0

我有一个应用程序,其中有许多活动,并且在应用程序“后面”我希望服务器套接字始终运行,应请求监听和提供数据。启动Android服务时强制关闭(作为服务器套接字)

所以我创建了一个服务,但也许我不理解它是如何工作的,因为我有一些问题。让我们来看看我的服务:

public class MyService extends Service { 
    private static final String TAG = "MyService"; 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null;  
    }  
    @Override 
    public void onCreate() { 
     Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
     Log.d("STATUS", "onCreate service");  

     try { 


      // create socket 
      ServerSocket servsock; 
      servsock = new ServerSocket(50000); 
      Log.v("STATUS","SERVER SOCKET CREATED at="+50000); 


while (true) { 
       Log.v("status","Waiting..."); 

       Socket sc = servsock.accept(); 
       Log.v("status","Accepted connection : " + sc); 

       ObjectOutputStream os = new ObjectOutputStream(sc.getOutputStream()); 
       ObjectInputStream is = new ObjectInputStream(sc.getInputStream()); 
       ......... 
       sc.close(); 

      } 

............. 

在我的应用程序显示这是一个登录界面,我想该服务登录后imediatelly启动(上创作的“登录”活动)

public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mainActivity); 

     startService(new Intent(this, MyService.class)); 
........ 
第一屏

问题是,当活动开始时,我得到一个黑色屏幕上方的强制关闭(有趣,因为startService在setContentView之后) - 尽管我可以通过Logcat看到服务(和服务器套接字)已执行。

活动管理给我提供以下信息:

01-10 17:55:43.706:E/ActivityManager(2490):ANR在 com.sapo.android.obesidade 01-10 17: E/ActivityManager(2490):Load:1.24/1.13/1.14/1.13/E/ActivityManager(2490):CPU使用率从43658ms到10ms前:01-10 17:55:43.706:E/ActivityManager(2490):system_server:6%= 3%用户+ 3%ke rnel/faults:7590 minor 01-10 17:55:43.706: E/ActivityManager(2490):.app.twlauncher:2%= 2%user + 0%kernel/ fault:812 minor 01-10 17:55 :43.706:E/ActivityManager(2490):
mmcqd:0%= 0%用户+ 0%内核

所以问题无疑是(它的工作原理,如果去掉)上,而(真) - 这是已经在Activity中的AsyncTask中工作(不使用服务)。

我该怎么办?

+0

坚持一秒,所以你运行这项服务作为异步任务? (在不同的线程?) – ScarletAmaranth 2012-01-10 18:40:34

+0

@ScarletAmaranth,不,我在使用服务之前运行(暂时)在AsyncTask上的服务器套接字!该解决方案的明显问题是我无法在后台运行服务器。 – Tiago 2012-01-10 19:45:58

回答

1

你的问题(与大多数ANRs一样)是你占用了主线程。默认情况下,服务在主(UI)线程上运行。由于你有一个while(true),它不断阻塞。你应该从你的服务启动一个单独的线程。

+0

这解决了我的问题:)非常感谢。 – Tiago 2012-01-11 12:24:33

1

您对服务Tiago有一些误解:
您启动的每项服务都默认在UI线程中运行。
线程与服务不同。
您只需要指定服务,以便它使用Java线程或AsyncTask在新线程中运行。

+0

我解决了我的问题的确是线程服务器:)问题其实,我不知道每个服务在UI线程中默认运行:) – Tiago 2012-01-11 12:25:20

相关问题