У меня есть интересная проблема, которую я пытался исправить уже более недели. Его на 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;
...
...
}
}
};
Будет радиовещательный приемник определенно работает? Я использую обработчики в приложении для обновления пользовательского интерфейса во всех других действиях, поэтому я стараюсь, чтобы все было одинаково! –
Да, я сделал несколько приложений, используя службы, которые обновляют ui с помощью широковещательного приемника. Обработчики лучше подходят для рабочих потоков в вашей деятельности. Однако услуги полностью отделены от вашей деятельности. – scubasteve623