0

我正在从活动启动服务。这里的问题是服务开始启动但活动没有显示。

@Override
protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.main);
           startService(new Intent(this, ServerActivity1.class));

        }

在服务中,我使用计时器通过这样的简单功能打开套接字。服务启动,因为我可以在日志中看到,但视图(R.layout.main)永远不会显示,并且在一段时间后强制显示关闭弹出。

    @Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    Toast.makeText(this, "sasa", Toast.LENGTH_SHORT).show();
    timer.scheduleAtFixedRate( new TimerTask() {
        public void run() {
            read();

        } 
    }, 0,50000);
    Log.i("NoServer","Started1");   
    read();

}

@Override
public void onDestroy() {

}

@Override
public void onStart(Intent intent, int startid) {
     Log.i("Home","Listening on IP: " + SERVERIP+"\n");
}


public  void  read()
{
    SERVERIP = getLocalIpAddress();
   Log.i("Home","Listening on IP: " + SERVERIP+"\n");
               if (SERVERIP != null) {
                Log.i("Home","Listening on IP: " + SERVERIP+"\n");
                }
                try {
                    serverSocket = new         ServerSocket(SERVERPORT);
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                   while (true) {
                      Socket client;
                      Log.i("Home","Listening on IP: " + SERVERIP+"\n");
                    try {
                            client = serverSocket.accept();
                            Log.i("Home","Listening on IP: " + SERVERIP+"\n");
                           BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                            while ((line = in.readLine()) != null) {                                                            
                            serverSocket.close();
                            read();
                        }

                       } catch (Exception e) {

                           e.printStackTrace();
                       }
                   }
          } 
4

1 回答 1

1

这是因为您的 UI 线程 ( main ) 正在由服务共享,除非您在清单中的单独进程中定义您的服务。如果您在活动的onResume方法中启动服务,那么在此之前您的服务将可见,但仍可能导致ANR,具体取决于完成服务请求所需的时间(最多 5 秒)。

最好将服务的所有套接字内容(或任何昂贵的调用)放在单独的线程中。在这种情况下,您的应用不会因 ANR 而挂起或崩溃。

您应该在 Service 内的单独线程中使用ThreadHandlerandHandler来执行消息和/或Runnables 。

于 2012-05-15T06:29:48.450 回答