启动服务后,不会显示视图

时间:2012-05-15 06:06:45

标签: android service

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

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

1 个答案:

答案 0 :(得分:1)

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

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

您应该使用ThreadHandlerHandler在服务中的单独线程中执行消息和/或 Runnables