【问题标题】:Getting NetworkOnMainThreadException while implementing Runnable [duplicate]在实现 Runnable 时获取 NetworkOnMainThreadException [重复]
【发布时间】:2016-01-24 22:03:14
【问题描述】:

我在使用 Runnable 时遇到 NetworkOnMainThreadException

代码:

public class FullscreenActivity extends AppCompatActivity {
    public Socket socket;
    public int SERVERPORT = 5000;           /* port 5000 (for testing) */
    public String SERVER_IP = "10.0.2.2";   /* local Android address of localhost */
    ViewFlipper flipper;
    ListView listing;

    public void attemptConnect(View view) {
        try {
            EditText editTextAddress = (EditText) findViewById(R.id.address);
            EditText editTextPort = (EditText) findViewById(R.id.port);
            String SERVER_IP_loc = editTextAddress.getText().toString();
            int SERVERPORT_loc = Integer.parseInt(editTextPort.getText().toString());
            System.out.println("Attempt Connect: IP " + SERVER_IP_loc + " Port: " + SERVERPORT_loc);
            System.out.println("SET");
            ClientThread myClientTask = new ClientThread(SERVER_IP_loc, SERVERPORT_loc);
            myClientTask.run();
            System.out.println("CONNECTED");
            flipper.setDisplayedChild(1);
        } catch (Exception e) {
            System.err.println(e.getMessage());
        }
    }

    // Thinks the following is not a thread ??
    class ClientThread implements Runnable {
        ClientThread(String addr, int port) {
            SERVER_IP = addr;
            SERVERPORT = port;
        }

        public void run() {
            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                // gets to this line fine
                socket = new Socket(serverAddr, SERVERPORT); 
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    }
}

我的权限设置为允许访问互联网:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

我收到以下错误:

    6188-6188/test W/System.err: android.os.NetworkOnMainThreadException
6188-6188/test W/System.err:     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
6188-6188/test W/System.err:     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:110)
6188-6188/test W/System.err:     at libcore.io.IoBridge.connectErrno(IoBridge.java:137)
6188-6188/test W/System.err:     at libcore.io.IoBridge.connect(IoBridge.java:122)
6188-6188/test W/System.err:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
6188-6188/test W/System.err:     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
6188-6188/test W/System.err:     at java.net.Socket.startupSocket(Socket.java:592)
6188-6188/test W/System.err:     at java.net.Socket.<init>(Socket.java:226)
6188-6188/test W/System.err:     at test.FullscreenActivity$ClientThread.run(FullscreenActivity.java:363)
6188-6188/test W/System.err:     at test(FullscreenActivity.java:340)
6188-6188/test W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
6188-6188/test W/System.err:     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(test:270)
6188-6188/test W/System.err:     at android.view.View.performClick(View.java:5198)
6188-6188/test W/System.err:     at android.view.View$PerformClick.run(View.java:21147)
6188-6188/test W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
6188-6188/test W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
6188-6188/test W/System.err:     at android.os.Looper.loop(Looper.java:148)
6188-6188/test W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5417)
6188-6188/test W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
6188-6188/test W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
6188-6188/test W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

据我所知,这应该可以按预期运行。似乎认为 Runnable 不是线程,但我不知道为什么。

【问题讨论】:

    标签: java android multithreading


    【解决方案1】:

    您需要Thread 来为您运行Runnable。简单地在 Runnable 上调用 run 不会在不同的线程上运行它。

    new Thread(new ClientThread(SERVER_IP_loc, SERVERPORT_loc)).start();
    

    【讨论】:

    • 这实际上并不能解决问题。尝试创建新套接字时仍然会抛出异常。
    • 你确定是在创建套接字的时候?您是否也尝试从 UI 线程之外的 Socket 中读取信息?
    • 是的。这个:InetAddress serverAddr = InetAddress.getByName(SERVER_IP); System.out.println("RUN2"); socket = new Socket(serverAddr, SERVERPORT); System.out.println("RUN3"); 进入 RUN2,但没有进入 RUN3。
    • 对不起,我想让你打电话给new Thread(...).start(),而不是new Thread(...).run()。查看更新的答案。
    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2011-09-04
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多