我有一个包含许多活动的应用程序,并且在应用程序“后面”我希望服务器套接字始终根据请求运行,监听和提供数据。
所以我创建了一项服务,但也许我不理解它是如何工作的,因为我遇到了一些问题。我们来看看我的服务:
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看到服务(和服务器套接字)已被执行。 / p>
活动经理向我提供以下信息:
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%内核
因此问题无疑是(在删除时有效)(在真实情况下) - 已经在Activity中的AsyncTask中工作(不使用Services)。
我该怎么办?
答案 0 :(得分:1)
您的问题(与大多数ANR一样)是您正在占用主线程。默认情况下,服务在主(UI)线程上运行。由于你有一个while(true)
,它会一直阻塞。您应该从服务中启动一个单独的线程。
答案 1 :(得分:1)
你对服务Tiago有一些误解:)
您启动的每个服务都默认在UI线程中运行
线程与服务不同。
您需要做的就是指定服务,以便它使用java线程或AsyncTask在新线程中运行。