首页 > 解决方案 > 将数据从客户端发送到桌面服务器

问题描述

我正在尝试将日期从Android作为客户端的NetBeans应用程序发送到作为服务器端的桌面应用程序,连接工作正常,甚至发送数据,但那是在我更新Android IDE到版本 3 之前!

现在,当我尝试发送数据时,出现以下异常:

android.os.NetworkOnMainThreadException

现在我在这里看到一个帖子是 Stackoverflow ......这个,我明白了,因为发送数据是在主线程上发生的,但我没有使用主线程发送数据,我仍然得到这个每次我尝试发送数据时都会出错。


代码说明:我有两种发送数据的方法,一种是在建立连接后只发送一次数据,第二种是随时发送数据,现在我的第一个在主线程上,但第二个在另一个线程上,第一个线程永远不会发生异常,但它总是会发生在第二个线程上,我听说一个解决方案是使用AsyncTask,我已经在第二个线程上使用它,现在我得到了 excpention大多数时候,但并非总是如此。


这是我的代码以便更好地理解:

这是第一个只在主线程上运行一次的方法,它将始终有效:

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 次之后,整个应用程序崩溃!

有人可以帮帮我吗?做我想做的事情的最佳做法是什么?(感谢任何帮助)

标签: javaandroidsocketsclient-servernetworkonmainthread

解决方案


推荐阅读