2015-08-31 4 views
0

У меня есть интересная проблема, которую я пытался исправить уже более недели. Его на Android и включает службу, работающую в фоновом режиме, для отправки сообщения в приложении.Служба Android не обновляет пользовательский интерфейс после запуска

Это довольно сложное, поэтому я перечислю ниже этапы:

1 - входит пользователь сообщение

2 - кнопка «отправить», который выбирает пользователя запускает приложения, основную службу (ComService/START_STICKY) и активность (HomeScreen) скрывает окно EditText используется для сообщения, заменив его TextView со словами «Передача»

3 - Сервис нерестится рабочий поток

4 - Сервис получает введен текст от активности и соединяется s ервере

5 - Service отправляет сообщение, а затем получает результат от сервера

6 - Сервис отсоединяется от сервера

7 - служба обновления активности, чтобы показать отправленное сообщение и показывает редактирования текста окно снова, как а также скрывает TextView с словом «Отправка»

Вопрос относится к этапу 7. Он использует обработчик и сообщение для связи с деятельностью, а также отдельный класс, который содержит состояние всех видов деятельности в приложение (чтобы проверить, одобрен ли пользовательский интерфейс для обновления), но я прокомментировал это из кода, и проблема все еще существует, так что это не так. Текущая настройка работает совершенно нормально, когда отладчик подключен без каких-либо проблем (почему нет логарифма) и в нечетном случае при закрытии приложения и запуске его снова. Проблема начинается, когда отладчик отключается, и приложение закрывается (через последние приложения) более 5 секунд. Служба завершила свою работу, отправив сообщение, поскольку сообщение добавлено в базу данных, а пользователь с другого конца получает его, это только обновление пользовательского интерфейса, которое является проблемой, все остальное, кажется, работает нормально!

Перед отправкой сообщения служба также подключается к серверу, если есть какие-то непрочитанные сообщения, указывающие другим пользователям, что пользователь просто его прочитал. Он следует очень похожим шагам, как указано выше, но был прокомментирован, и этот вопрос по-прежнему остается прежним.

Ill пост код для соответствующих шагов ниже: Этапа 2

// Starts service to communicate with the server to send a message 
Intent service = new Intent(this, ComService.class); 
service.putExtra(ComService.requestType, ComService.sendTextMessage); 
startService(service); 

Этап 3

// Run when the service is being created 
@Override 
public int onStartCommand(Intent newIntent, int flags, int startId) 
{ 
    intent = newIntent; 
    currentInstance = this; 

    // Launches processing thread 
    ServiceHelper serviceHelper = new ServiceHelper(newIntent, this); 
    serviceHelper.start(); 

    return Service.START_STICKY; 
} 

Stage 4/5/6/7

// Sends a message with only text content 
public void startText() 
{ 
    // Initialises the class holding activity data 
    StateManager sm = new StateManager(context); 

    // Gets the data ready to be sent 
    if(sm.getHomeScreen()) 
    { 
     // Friend id and time 
     friendId = HomeScreen.getFriendId(); 

     // Gets the message text 
     messageTextContent = HomeScreen.getTextMessage(); // STAGE 4 
    } 
    else 
    { 
     allGood = false; 
    } 

    try 
    { 
     // Checks if any errors 
     if(allGood) 
     { 
      // Checks if message to be sent is blank 
      if(!messageTextContent.equals("") & messageTextContent.equals(" ") & !(messageTextContent == "") & !(messageTextContent == " ")) 
      { 
       // Connects 
       (sh.new Utility()).connect(); // STAGE 4 

       // Checks if logged in 
       if((sh.new CheckLogin()).start()) 
       { 
        // Sends request 
        sh.getNetwork().sendData(ServiceHelper.sendMessageTextRequest); 

        // Sends the friend id who message is addressed to 
        sh.getNetwork().sendData(friendId); 

        // Gets message date 
        messageDate = sh.getNetwork().getDataAsString(); 

        // Sends the message type 
        sh.getNetwork().sendData(textType); 

        // Sends the message text 
        sh.getNetwork().sendData(messageTextContent); // STAGE 5 

        // Gets the message number 
        messageNumber = Integer.parseInt(sh.getNetwork().getDataAsString()); 

        // Gets result and check if successful 
        String result = sh.getNetwork().getDataAsString(); // STAGE 5 
        if(!result.equals(ServiceHelper.requestSuccessful)) 
        { 
         // Not successful 
         allGood = false; 
         errorMessage = result; 
        } 
        else 
        { 
         // Successful and saves data to database 
         addDatabaseTextMessage(); 
        } 

        // Sends received indicator 
sh.getNetwork().sendData(ServiceHelper.receivedIndicator); 

       } 
       else 
       { 
        allGood = false; 
        errorMessage = tryAgainMsg; 
       } 

       // Closes connection 
       (sh.new Utility()).finishConnection(); // STAGE 6 

       // Gets current friend record 
       UserDatabase db = new UserDatabase(context); 
       FriendRecord fr = db.getFriendRecord(Integer.parseInt(friendId)); 

       // Increments message numbers by one and updates database 
       fr.setTotalExchanged(fr.getTotalExchanged() + 1); 
       db.updateFriendRecord(fr); 
      } 
      else 
      { 
       allGood = false; 
       errorMessage = msgBlank; 
      } 
     } 
     else 
     { 
      allGood = false; 
      errorMessage = tryAgainMsg; 
     } 
    } catch(IOException e) 
    { 
     allGood = false; 
     errorMessage = checkConnectionMsg; 

     // Adds to log cat 
     Log.e(this.getClass().getSimpleName(), e.getMessage()); 
    } catch(Exception e2) 
    { 
     allGood = false; 
     errorMessage = tryAgainMsg; 

     // Adds to log cat 
     Log.e(this.getClass().getSimpleName(), e2.getMessage()); 
    } 

    // Decides on result 
    if(allGood) 
    { 
     // Refreshes the ui 
     if(sm.getHomeScreen()) // STAGE 6 
     { 
      Message msg = HomeScreen.homeScreenInterface.obtainMessage(HomeScreen.sendSuccess); // STAGE 7 
      HomeScreen.homeScreenInterface.sendMessage(msg); // STAGE 7 
     } 
    } 
    else 
    { 
     // Indicates error on ui 
     if(sm.getHomeScreen()) 
     { 
      Message msg = HomeScreen.homeScreenInterface.obtainMessage(HomeScreen.messageSendError); // STAGE 7 
      msg.obj = errorMessage; // STAGE 6 
      HomeScreen.homeScreenInterface.sendMessage(msg); // STAGE 7 
     } 
    } 
} 

государственных 7 (обновление UI)

// Deals with service responses 
public static Handler homeScreenInterface = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) 
    { 
     switch(msg.what) 
     { 
... 
... 
      case HomeScreen.sendSuccess: 
      // Enables and clears input 
      HomeScreen.messageInput.setEnabled(true); 
      HomeScreen.messageInput.setText(""); 

      // Shows the message send menu and hides sending text 
      HomeScreen.sendMenu.setVisibility(View.VISIBLE); 
      HomeScreen.sendingText.setVisibility(View.GONE); 

      // Clears message variable 
      message = ""; 
      attachment = null; 

      try 
      {     
       // Reloads the message list 
       messageFriendId = ""; 
       currentInstance.loadMessageList(true); 
      } catch (Exception e) 
      { 
       currentInstance.loadingScreen.open("Error", "Try again later!", true, "Ok", currentInstance); 
      } 

      // Checks if the message is sending 
      isMessageSending = false; 
      break; 
... 
... 
     } 
    } 
}; 

ответ

0

Попробуйте использовать широковещательный приемник вместо обработчика, чтобы обновить свой ui.

http://developer.android.com/reference/android/content/BroadcastReceiver.html

private BroadcastReceiver bReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getAction().equals("UPDATE")) { 
      String text = intent.getStringExtra("output"); 
      updateUI(text); 
     } 
     else if(intent.getAction().equals("RESTART")) { 
      //other stuff 
      Board.this.startService(i); 
     } 
    } 
}; 

//from Service 
Intent intent = new Intent(); 
       intent.setAction("UPDATE"); 
       intent.putExtra("output",modifiedSentence); 
        LocalBroadcastManager.getInstance(this).sendBroadcast(intent); 


//onStart 
LocalBroadcastManager bManager = LocalBroadcastManager.getInstance(this); 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction("UPDATE"); 
    filter.addAction("RESTART"); 
    bManager.registerReceiver(bReceiver, filter); 

//onPause 
LocalBroadcastManager bManager = LocalBroadcastManager.getInstance(this); 
    bManager.unregisterReceiver(bReceiver); 
+0

Будет радиовещательный приемник определенно работает? Я использую обработчики в приложении для обновления пользовательского интерфейса во всех других действиях, поэтому я стараюсь, чтобы все было одинаково! –

+0

Да, я сделал несколько приложений, используя службы, которые обновляют ui с помощью широковещательного приемника. Обработчики лучше подходят для рабочих потоков в вашей деятельности. Однако услуги полностью отделены от вашей деятельности. – scubasteve623

Смежные вопросы