-1

我正在尝试构建一个不断从运行 dump1090 的服务器读取 SBS-1 数据的应用程序。我认为我最好使用 Service 而不是 AsyncTask 这样做,因为至少它的生命周期将独立于 UI 组件,而且 AFAIK AsyncTasks 应该用于短期操作。

这是我的代码:

@Override
public void onCreate() {
    super.onCreate();
    try {
        //TODO: NetworkOnMainThread error
        socket = new Socket(SERVER_URL, SERVER_PORT);
        socketConnected = true;
        inputStream = socket.getInputStream();
        diStream = new DataInputStream(inputStream);
        readerOpen = true;
        ConnectSocket connectSocket = new ConnectSocket();
        Log.d(getClass().toString(), "Socket created!");
    } catch (IOException e) {
        e.printStackTrace();
    }
}

但是,一旦我启动应用程序,就会发生这种情况:

FATAL EXCEPTION: main
Process: com.example.[APP_NAME], PID: 2317
java.lang.RuntimeException: Unable to create service com.example.[APP_NAME].services.SocketService: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2887)
at android.app.ActivityThread.-wrap4(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1273)
at java.net.InetAddress.lookupHostByName(InetAddress.java:431)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252)
at java.net.InetAddress.getAllByName(InetAddress.java:215)
at java.net.Socket.tryAllAddresses(Socket.java:109)
at java.net.Socket.<init>(Socket.java:178)
at java.net.Socket.<init>(Socket.java:150)
at com.example.[APP_NAME].services.SocketService.onCreate(SocketService.java:50)
at android.app.ActivityThread.handleCreateService(ActivityThread.java:2877)
at android.app.ActivityThread.-wrap4(ActivityThread.java) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:148) 
at android.app.ActivityThread.main(ActivityThread.java:5417) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

我究竟做错了什么?我需要添加一个新线程来运行我的服务吗?

4

3 回答 3

3

Android 不允许在主线程上进行网络调用,因为这会导致主线程上出现不必要的延迟,因此默认情况下会抛出错误。

要进行网络调用,您可以使用 Threads 和 AsyncTask 进行后台网络调用。

进行网络调用的最简单方法是使用基本上用于“LowData 网络调用”的 AsysncTask

 private class DownloadWebpageTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... urls) {

            // params comes from the execute() call: params[0] is the url.
            try {
                return downloadUrl(urls[0]);
            } catch (IOException e) {
                return "Unable to retrieve web page. URL may be invalid.";
            }
        }
        // onPostExecute displays the results of the AsyncTask.
        @Override
        protected void onPostExecute(String result) {
            textView.setText(result);
       }
    }

对于后台网络调用,您也可以使用“VOLLEY”等库。

于 2015-12-02T11:44:25.737 回答
0

原因:android.os.NetworkOnMainThreadException 这意味着您应该在与 Main/UI 线程不同的线程上启动您的服务。当您尝试从主线程访问网络资源时,您总是会看到此异常。更多信息:如何修复 android.os.NetworkOnMainThreadException?

于 2015-12-02T11:43:19.303 回答
0

尝试在后台进程中使用您的 Socket。为此使用 AsyncTask。我遇到了同样的问题,它得到了解决。并确保您已在 INTERNET 清单 ACCESS_NETWORK_STATE 中授予权限。

于 2015-12-02T11:29:00.183 回答