2012-01-10 87 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

相關問題