Отправка данных с клиента на настольный сервер - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь отправить дату из приложения 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 раз все приложение завершается сбоем !!

Может кто-нибудь помочь мне? Как лучше всего делать то, что я пытаюсь сделать? (признателен за любую помощь)

...