我正在从活动开始提供服务。这里的问题是服务开始启动但活动没有显示。
@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();
}
}
}
答案 0 :(得分:1)
这是因为除非您在清单中的单独进程中定义服务,否则您的UI线程( main )将由服务共享。如果您在活动的 onResume 方法中启动服务,那么您的服务将可见,但仍可能导致 ANR ,具体取决于完成请求所需的时间(最多5秒)在服务中。
最好将服务的所有套接字(或任何昂贵的调用)放在单独的线程中。在这种情况下,由于ANR,您的应用不会挂起或崩溃。
您应该使用ThreadHandler
和Handler
在服务中的单独线程中执行消息和/或 Runnables 。