【问题标题】:Getting Force Close when starting Android Service (as Server Socket)启动 Android 服务时强制关闭(作为服务器套接字)
【发布时间】:2012-01-10 18:08:09
【问题描述】:

我有一个包含许多活动的应用程序,并且在应用程序“后面”我希望服务器套接字始终运行、侦听并根据请求提供数据。

所以我创建了一个服务,但我可能不明白它是如何工作的,因为我遇到了一些问题。让我们看看我的服务:

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 看到服务(和服务器套接字)已执行。

活动经理给了我以下信息:

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% 内核

所以问题无疑是(如果删除它会起作用)while(true) - 一些已经在 Activity 中的 AsyncTask 中工作的东西(不使用服务)。

我能做什么?

【问题讨论】:

  • 等一下,所以你正在将此服务作为异步任务运行? (在不同的线程中?)
  • @ScarletAmaranth,不,在使用服务之前,我正在(临时)在 AsyncTask 上运行服务器套接字!该解决方案的明显问题是我无法在后台运行服务器。

标签: java android


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我确实解决了我的问题,确实线程化了服务器 :) 问题实际上是,我不知道每个服务默认在 UI 线程中运行 :)
    猜你喜欢
    • 1970-01-01
    • 2013-01-22
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 2014-08-11
    • 2011-11-19
    • 2014-02-28
    相关资源
    最近更新 更多