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

标签 java android

我有一个具有许多 Activity 的应用程序,并且在该应用程序“后面”我希望服务器套接字始终运行,根据请求监听和提供数据。

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

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();

            }

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

在我的应用程序中出现的第一个屏幕是登录屏幕,我希望服务在登录后立即启动(在创建“登录” Activity 时)

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

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

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

Activity 经理向我提供以下信息:

01-10 17:55:43.706: E/ActivityManager(2490): ANR in com.sapo.android.obesidade 01-10 17:55:43.706: E/ActivityManager(2490): Reason: Executing service com.sapo.android.obesidade/.MyService 01-10 17:55:43.706: E/ActivityManager(2490): Load: 1.24 / 1.13 / 1.1 01-10 17:55:43.706: E/ActivityManager(2490): CPU usage from 43658ms to 10ms ago: 01-10 17:55:43.706: E/ActivityManager(2490): system_server: 6% = 3% user + 3% kernel / faults: 7590 minor 01-10 17:55:43.706: E/ActivityManager(2490): .app.twlauncher: 2% = 2% user + 0% kernel / faults: 812 minor 01-10 17:55:43.706: E/ActivityManager(2490):
mmcqd: 0% = 0% user + 0% kernel

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

我能做什么?

最佳答案

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

关于java - 启动 Android 服务时强制关闭(作为服务器套接字),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8808203/

相关文章:

java - 初始化自定义类数组

java - 尝试创建数组列表给了我这个错误

java - 找不到用于内省(introspection)工厂方法的类文件: java. util.concurrent.ThreadPoolExecutor.DiscardPolicy

android - 我们可以在没有物理罗盘的情况下获得罗盘方向吗(例如使用 2 个 GPS 点?)

java - WindowManager : MainActivity has leaked window com. android.internal.policy.impl.PhoneWindow$DecorView@40731aa0 是原始的

安卓 : Paypal implementation

java - Eclipse 比较编辑器 : Ignoring "$Id:" Lines

java - SNMP协议(protocol)中的NullPointerException

android - 从 fragment 中的 onItemClick 访问 BottomNavigationView 项目

android - Android 中的导航栏 : size and position