错误:使用asynctask时出现android.os.NetworkOnMainThreadException

耶勒

我在创建套接字并将消息从android应用发送到树莓派时遇到问题。我从以下站点使用了此示例:http : //android-er.blogspot.nl/2016/05/android-client-example-2-communicate.html,这是为了了解套接字的工作方式。但是当我使用AsyncTask时,我仍然收到了android.os.NetworkOnMainThreadException。这是我的MainActivity:

public class MainActivity extends AppCompatActivity {

    EditText editTextAddress, editTextPort, editTextMsg;
    Button buttonConnect, buttonDisconnect, buttonSend;
    TextView textViewState, textViewRx;

    ClientHandler clientHandler;
    ClientThread clientThread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        editTextAddress = (EditText) findViewById(R.id.address);
        editTextPort = (EditText) findViewById(R.id.port);
        editTextMsg = (EditText) findViewById(R.id.msgtosend);
        buttonConnect = (Button) findViewById(R.id.connect);
        buttonDisconnect = (Button) findViewById(R.id.disconnect);
        buttonSend = (Button)findViewById(R.id.send);
        textViewState = (TextView)findViewById(R.id.state);
        textViewRx = (TextView)findViewById(R.id.received);

        buttonDisconnect.setEnabled(false);
        buttonSend.setEnabled(false);

        buttonConnect.setOnClickListener(buttonConnectOnClickListener);
        buttonDisconnect.setOnClickListener(buttonDisConnectOnClickListener);
        buttonSend.setOnClickListener(buttonSendOnClickListener);

        clientHandler = new ClientHandler(this);
    }

    View.OnClickListener buttonConnectOnClickListener = new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

            MainActivity.this.startService(new Intent(MainActivity.this,
                    ClientThread.class));

            clientThread = new ClientThread(
                    editTextAddress.getText().toString(),
                    Integer.parseInt(editTextPort.getText().toString()),
                    clientHandler);
            clientThread.execute();




            buttonConnect.setEnabled(false);
            buttonDisconnect.setEnabled(true);
            buttonSend.setEnabled(true);
        }
    };

    View.OnClickListener buttonDisConnectOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(clientThread != null){
                clientThread.setRunning(false);
            }

        }
    };
    String msgToSend;
    View.OnClickListener buttonSendOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(clientThread != null){
                msgToSend = editTextMsg.getText().toString();
                clientThread.txMsg(msgToSend);
            }
        }
    };

    private void updateState(String state){
        textViewState.setText(state);
    }

    private void updateRxMsg(String rxmsg){
        textViewRx.append(rxmsg + "\n");
    }

    private void clientEnd(){
        clientThread = null;
        textViewState.setText("clientEnd()");
        buttonConnect.setEnabled(true);
        buttonDisconnect.setEnabled(false);
        buttonSend.setEnabled(false);

    }

    public static class ClientHandler extends Handler {
        public static final int UPDATE_STATE = 0;
        public static final int UPDATE_MSG = 1;
        public static final int UPDATE_END = 2;
        private MainActivity parent;

        public ClientHandler(MainActivity parent) {
            super();
            this.parent = parent;
        }

        @Override
        public void handleMessage(Message msg) {

            switch (msg.what){
                case UPDATE_STATE:
                    parent.updateState((String)msg.obj);
                    break;
                case UPDATE_MSG:
                    parent.updateRxMsg((String)msg.obj);
                    break;
                case UPDATE_END:
                    parent.clientEnd();
                    break;
                default:
                    super.handleMessage(msg);
            }

        }

    }
}

这是ClientThread.java代码:

public class ClientThread extends AsyncTask<Void, Void, Void>{

    String dstAddress;
    int dstPort;
    private boolean running;
    MainActivity.ClientHandler handler;

    Socket socket;
    PrintWriter printWriter;
    BufferedReader bufferedReader;


    public ClientThread(String addr, int port, MainActivity.ClientHandler handler) {
        super();
        dstAddress = addr;
        dstPort = port;
        this.handler = handler;
    }

    public void setRunning(boolean running){
        this.running = running;
    }

    private void sendState(String state){
        handler.sendMessage(
                Message.obtain(handler,
                        MainActivity.ClientHandler.UPDATE_STATE, state));
    }

    public void txMsg(String msgToSend){

        if(printWriter != null){
            printWriter.println(msgToSend);
        }
    }



    @Override
    protected Void doInBackground(Void... arg0) {
        System.out.println("In doinbackground");

        sendState("connecting...");

        running = true;

        try {
            socket = new Socket(dstAddress, dstPort);
            sendState("connected");

            OutputStream outputStream = socket.getOutputStream();
            printWriter = new PrintWriter(outputStream, true);

            InputStream inputStream = socket.getInputStream();
            InputStreamReader inputStreamReader =
                    new InputStreamReader(inputStream);
            bufferedReader = new BufferedReader(inputStreamReader);

            while (running) {

                //bufferedReader block the code
                String line = bufferedReader.readLine();
                if (line != null) {
                    handler.sendMessage(
                            Message.obtain(handler,
                                    MainActivity.ClientHandler.UPDATE_MSG, line));
                }

            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (printWriter != null) {
                printWriter.close();
            }

            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        handler.sendEmptyMessage(MainActivity.ClientHandler.UPDATE_END);
        return null;
    }

}

这是我得到的错误:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.example.zerocj.projectsocked, PID: 2415
                  android.os.NetworkOnMainThreadException
                      at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)
                      at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:111)
                      at java.net.SocketOutputStream.write(SocketOutputStream.java:157)
                      at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
                      at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
                      at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
                      at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
                      at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
                      at java.io.BufferedWriter.flush(BufferedWriter.java:254)
                      at java.io.PrintWriter.newLine(PrintWriter.java:482)
                      at java.io.PrintWriter.println(PrintWriter.java:629)
                      at java.io.PrintWriter.println(PrintWriter.java:740)
                      at com.example.zerocj.projectsocked.ClientThread.txMsg(ClientThread.java:47)
                      at com.example.zerocj.projectsocked.MainActivity$3.onClick(MainActivity.java:85)
                      at android.view.View.performClick(View.java:5610)
                      at android.view.View$PerformClick.run(View.java:22260)
                      at android.os.Handler.handleCallback(Handler.java:751)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:154)
                      at android.app.ActivityThread.main(ActivityThread.java:6077)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
萨文

请检查您的堆栈跟踪。它说在代码中使用严格模式

int SDK_INT = android.os.Build.VERSION.SDK_INT;

if (SDK_INT > 8)
{
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                    .permitAll().build();
    StrictMode.setThreadPolicy(policy);

    // Where you get exception write that code inside this.
}

希望对您有所帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用AsyncTask时出现错误android.os.NetworkOnMainThreadException(使用gson解析json数据)

来自分类Dev

android.os.NetworkOnMainThreadException

来自分类Dev

AsyncTask的doInBackground中的android.os.NetworkOnMainThreadException

来自分类Dev

改造-android.os.NetworkOnMainThreadException

来自分类Dev

android.os.NetworkOnMainThreadException异常

来自分类Dev

异常android.os.NetworkOnMainThreadException

来自分类Dev

中的Android.OS.NetworkOnMainThreadException

来自分类Dev

android.os.NetworkOnMainThreadException:重构代码以使用AsyncTask吗?

来自分类Dev

Android HttpGet android.os.NetworkOnMainThreadException

来自分类Dev

android.os.NetworkOnMainThreadException内新线程

来自分类Dev

突然获取android.os.NetworkOnMainThreadException

来自分类Dev

如何解决android.os.NetworkOnMainThreadException?

来自分类Dev

android.os.NetworkOnMainThreadException-对于按钮单击

来自分类Dev

如何解决android.os.networkonmainthreadexception

来自分类Dev

如何解决android.os.networkonmainthreadexception

来自分类Dev

“android.os.NetworkOnMainThreadException”即使在 AsyncTask 中运行

来自分类Dev

由于Android.os.NetworkOnMainThreadException而导致设计AsynTask类时出现问题

来自分类Dev

IntentService的onHandleIntent方法中的android.os.NetworkOnMainThreadException

来自分类Dev

改造-带有RxKotlin的android.os.NetworkOnMainThreadException

来自分类Dev

如何修复&#39; android.os.NetworkOnMainThreadException&#39 ;?

来自分类Dev

如何解决json中的android.os.NetworkOnMainThreadException

来自分类Dev

IntentService的onHandleIntent方法中的android.os.NetworkOnMainThreadException

来自分类Dev

更新 GridView 会触发 android.os.NetworkOnMainThreadException

来自分类Dev

我在使用单独的线程时得到了“ android.os.NetworkOnMainThreadException”

来自分类Dev

使用Okhttp从PHP脚本获取数据时遇到android.os.NetworkOnMainThreadException

来自分类Dev

在主线程上解析XML,但通过AsyncTask下载-“无效的流或编码:android.os.NetworkOnMainThreadException”

来自分类Dev

android.os.NetworkOnMainThreadException,并且无法通过AsyncTask(jsoup)进行修复

来自分类Dev

即使使用AsyncTask,也可能出现NetworkOnMainThreadException

来自分类Dev

仍然出现android.os.NetworkOnMainThreadException,我在做什么错?

Related 相关文章

  1. 1

    使用AsyncTask时出现错误android.os.NetworkOnMainThreadException(使用gson解析json数据)

  2. 2

    android.os.NetworkOnMainThreadException

  3. 3

    AsyncTask的doInBackground中的android.os.NetworkOnMainThreadException

  4. 4

    改造-android.os.NetworkOnMainThreadException

  5. 5

    android.os.NetworkOnMainThreadException异常

  6. 6

    异常android.os.NetworkOnMainThreadException

  7. 7

    中的Android.OS.NetworkOnMainThreadException

  8. 8

    android.os.NetworkOnMainThreadException:重构代码以使用AsyncTask吗?

  9. 9

    Android HttpGet android.os.NetworkOnMainThreadException

  10. 10

    android.os.NetworkOnMainThreadException内新线程

  11. 11

    突然获取android.os.NetworkOnMainThreadException

  12. 12

    如何解决android.os.NetworkOnMainThreadException?

  13. 13

    android.os.NetworkOnMainThreadException-对于按钮单击

  14. 14

    如何解决android.os.networkonmainthreadexception

  15. 15

    如何解决android.os.networkonmainthreadexception

  16. 16

    “android.os.NetworkOnMainThreadException”即使在 AsyncTask 中运行

  17. 17

    由于Android.os.NetworkOnMainThreadException而导致设计AsynTask类时出现问题

  18. 18

    IntentService的onHandleIntent方法中的android.os.NetworkOnMainThreadException

  19. 19

    改造-带有RxKotlin的android.os.NetworkOnMainThreadException

  20. 20

    如何修复&#39; android.os.NetworkOnMainThreadException&#39 ;?

  21. 21

    如何解决json中的android.os.NetworkOnMainThreadException

  22. 22

    IntentService的onHandleIntent方法中的android.os.NetworkOnMainThreadException

  23. 23

    更新 GridView 会触发 android.os.NetworkOnMainThreadException

  24. 24

    我在使用单独的线程时得到了“ android.os.NetworkOnMainThreadException”

  25. 25

    使用Okhttp从PHP脚本获取数据时遇到android.os.NetworkOnMainThreadException

  26. 26

    在主线程上解析XML,但通过AsyncTask下载-“无效的流或编码:android.os.NetworkOnMainThreadException”

  27. 27

    android.os.NetworkOnMainThreadException,并且无法通过AsyncTask(jsoup)进行修复

  28. 28

    即使使用AsyncTask,也可能出现NetworkOnMainThreadException

  29. 29

    仍然出现android.os.NetworkOnMainThreadException,我在做什么错?

热门标签

归档