2012-01-10 2 views
0

У меня есть приложение со многими действиями, а «за» приложение я хочу, чтобы серверный сокет всегда работал, слушая и обслуживая данные по запросу.Получение Force Close при запуске Android-сервиса (как сокета сервера)

Итак, я создал службу, но, возможно, я не понимаю, как это работает, потому что у меня проблемы. Давайте посмотрим, мое обслуживание:

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

      } 

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

В мое приложение на первом экране появляется это окно Логин, и я хочу, чтобы служба запускалась imediatelly после входа в систему (о создании «вошли в» деятельности)

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

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

Проблема в том, что когда начинается действие, я получаю Force Close над черным экраном (интересно, потому что startService после setContentView) - хотя я вижу через Logcat, что служба (и серверный сокет) была выполнена.

менеджер

Активность дает мне следующую информацию:

01-10 17: 55: 43.706: E/ActivityManager (2490): ANR в com.sapo.android.obesidade 01-10 17: 55: 43.706: E/ActivityManager (2490): Причина: Выполнение услуги ru.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): загрузка процессора с 43658ms до 10ms назад: 01-10 17: 55: 43.706: E/ActivityManager (2490): system_server: 6% = 3% пользователь + 3% ke rnel/faults: 7590 minor 01-10 17: 55: 43.706: E/ActivityManager (2490): .app.twlauncher: 2% = 2% пользователь + 0% ядро ​​/ ошибки: 812 minor 01-10 17:55 : 43,706: E/ActivityManager (2490):
mmcqd: 0% = 0% пользователей + 0% ядра

Таким образом, проблема, несомненно (она работает, если удалить) на некоторое время (правда) - то, что уже работал в AsyncTask в Activity (без использования Сервисов).

Что я могу сделать?

+0

Удерживайте паузу, так что вы используете эту службу как задачу асинхронного вызова? (В другом потоке?) – ScarletAmaranth

+0

@ScarletAmaranth, нет, я использовал (временно) серверный сокет на AsyncTask, прежде чем использовать Сервисы! Очевидно, проблема этого решения в том, что я не могу запустить сервер в фоновом режиме. – Tiago

ответ

1

Ваша проблема (как и в большинстве ANR) заключается в том, что вы забиваете основную нить. Служба по умолчанию работает в основном потоке (UI). Поскольку у вас есть while(true), он постоянно блокируется. Вы должны запустить отдельный поток из своей службы.

+0

Это решило мою проблему :) Большое спасибо. – Tiago

1

У вас есть некоторые неправильные представления об услугах Tiago :)
Каждая служба запускает запуск по умолчанию в потоке пользовательского интерфейса.
Тема отлична от службы.
Все, что вам нужно сделать, это указать службу, чтобы она работала в новом потоке либо с использованием java-потоков, либо с помощью AsyncTask.

+0

Я решил, что проблема действительно связана с сервером :) Проблема была в самом деле, я понятия не имел, что каждая служба работает по умолчанию в потоке пользовательского интерфейса :) – Tiago