Я пытаюсь отправить дату из приложения Android
на стороне клиента в приложение NetBeans
на рабочем столе на стороне сервера, соединение работает просто отлично, даже отправка данных, но это было до того, как я обновил свой Android IDE
до версии 3!
Теперь, когда я пытаюсь отправить данные, я получаю следующее исключение:
android.os.NetworkOnMainThreadException
Теперь я увидел пост здесь Stackoverflow ... этот , и я получил это, потому что отправка данных происходит в главном потоке, но я не использую основной поток для отправки данные, и я все еще получаю эту ошибку каждый раз, когда я пытаюсь отправить данные.
Объяснение кода: У меня есть два метода, которые отправляют данные, один для отправки данных только один раз после установления соединения, а второй один раз для отправки данных в любое время, теперь мой первый в главном потоке, но второй находится в другом потоке, исключение никогда не встречается в первом, но всегда будет во втором, я слышал, что одним из решений является использование AsyncTask
, и я использовал это на втором, и теперь я получаю плату большую часть времени, но не всегда.
Вот мой код для лучшего понимания:
Это первый метод, который запускается только один раз и в основном потоке, и он всегда будет работать:
private void SendInformation(){
try{
OutPut = new BufferedWriter(new OutputStreamWriter(ConnectionSocket.getOutputStream(), "UTF-8"));
OutPut.write(android.os.Build.MODEL);
OutPut.newLine();
OutPut.flush();
}catch(Exception e){
e.printStackTrace();
}
}
Это мой второй с потоком, и это всегда дает исключение:
public static void SendDetails(String S1, String S2){
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
public void run(){
try{
OutPut = new BufferedWriter(new OutputStreamWriter(ConnectionSocket.getOutputStream(), "UTF-8"));
OutPut.write(S1 + "," + S2);
OutPut.newLine();
OutPut.flush();
}catch(Exception e){
e.printStackTrace();
MainActivity.ErrorMessage.setText(e.toString());
}
}
}, Delay * 1000);
}
И это одна и та же секунда, но с использованием AsyncTask
:
private static SendInfoTask SIT = new SendInfoTask();
public static void SendDetails(String S1, String S2){
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
public void run(){
SIT.execute();
}
}, Delay * 1000);
}
static class SendInfoTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... params) {
try{
OutPut = new BufferedWriter(new OutputStreamWriter(ConnectionSocket.getOutputStream(), "UTF-8"));
OutPut.write(Client.AppName + "," + Client.NotificationText);
OutPut.newLine();
OutPut.flush();
}catch(Exception e){
e.printStackTrace();
MainActivity.ErrorMessage.setText(e.toString());
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
Иногда это работает, а иногда нет, и когда это работает, после попытки отправить как 5 раз все приложение завершается сбоем !!
Может кто-нибудь помочь мне? Как лучше всего делать то, что я пытаюсь сделать? (признателен за любую помощь)