启动Android服务时关闭强制关闭(作为服务器套接字)

时间:2012-01-10 18:08:10

标签: java 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();

            }

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

在我的应用程序中,第一个屏幕显示为登录屏幕,我希望该服务在登录后立即启动(创建“登录”活动时)

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

        startService(new Intent(this, MyService.class));
........

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

活动经理向我提供以下信息:

  

01-10 17:55:43.706:E / ActivityManager(2490):ANR in   com.sapo.android.obesidade 01-10 17:55:43.706:   E / ActivityManager(2490):原因:执行服务   com.sapo.android.obesidade / .MyService 01-10 17:55:43.706:   E / ActivityManager(2490):加载:1.24 / 1.13 / 1.1 01-10 17:55:43.706:   E / ActivityManager(2490):CPU使用率从43658ms到10ms前:01-10   17:55:43.706:E / ActivityManager(2490):system_server:6%= 3%user +   3%内核/故障:7590次要01-10 17:55:43.706:   E / ActivityManager(2490):. app.twlauncher:2%= 2%用户+ 0%内核/   故障:812次要01-10 17:55:43.706:E / ActivityManager(2490):
  mmcqd:0%= 0%用户+ 0%内核

因此问题无疑是(在删除时有效)(在真实情况下) - 已经在Activity中的AsyncTask中工作(不使用Services)。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

相关问题