为什么在onProgressUpdate上出现NetworkOnMainThread异常错误

时间:2019-04-19 17:57:16

标签: android exception android-asynctask

我正在使用AsyncTask读取填充后的“ / proc / net / arp”文件。问题是,在我阅读每一行之后,我想为每个IP地址进行名称解析。那就是我遇到异常错误的时候。我没有在主线程上执行此操作,因为我正在为此过程使用AsyncTask。这是我的onProgressUpdate方法

protected void onProgressUpdate(Void... params) {
            //update progress bar
            /*scanProgress.setProgress(values[0].progressBar);*/
            try {

                BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(ARP_TABLE), "UTF-8"));
                reader.readLine(); // Skip header.
                String line;
                while ((line = reader.readLine()) != null) {
                    Log.v("ARPFILE", line);
                    String[] arpLine = line.split("\\s+");
                    //if arp line contains flag 0x2 we parse host
                    if(arpLine[2].equals(ARP_FLAG)) {
                        final String ip = arpLine[0];
                        final String flag = arpLine[2];
                        final String mac = arpLine[3];
                        Node node = new Node(ip, mac);
                        hostList.add(node);
                        networkAdapter.notifyDataSetInvalidated();
//                        scanProgress.setProgress(node.progressBar);
                    }
                }
                reader.close();
            }
            catch (Exception ex) {

            }

            for(Node node: hostList) {
                InetAddress inetAddress;
                android.os.Debug.waitForDebugger();
                try {
                    inetAddress = InetAddress.getByName(node.ip);
                    String hostname = inetAddress.getCanonicalHostName();
                    node.setHostName(hostname);
                    Log.v("HOSTNAME", hostname);
                } catch (UnknownHostException e) {
                    // It's common that many discovered hosts won't have a NetBIOS entry.
                }
            }
        }

1 个答案:

答案 0 :(得分:2)

  

我没有在主线程上执行此操作,因为我为此使用了AsyncTask   处理。这是我的onProgressUpdate方法

在主线程上调用了onProgressUpdate()方法 From the Documentation for AsyncTask

  

onProgressUpdate(Progress...),在调用后在UI线程上调用   到publishProgress(Progress...)。执行的时间是   未定义。此方法用于显示进度中的任何形式的进度   用户界面,而后台计算仍在执行。   例如,它可以用于为进度栏设置动画或显示日志   一个文本字段。

执行应在doInBackground()中的UI线程上完成的所有代码