Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 运行AsyncTask时获取运行时异常_Android_Android Studio_Exception - Fatal编程技术网

Android 运行AsyncTask时获取运行时异常

Android 运行AsyncTask时获取运行时异常,android,android-studio,exception,Android,Android Studio,Exception,使用AsyncTask类,我在Runtime时得到一个异常。但我无法准确地指出发生这种情况时,BufferReader中的确切位置。我可以在调试器中看到,在我的设备上读取文件的第一行和第二行,但我认为此时创建节点对象或更新进度是在抛出异常时。感谢您的帮助 package com.example.george.droidscanner; import android.os.AsyncTask; import android.os.Bundle; import android.support.v7

使用
AsyncTask
类,我在
Runtime
时得到一个
异常。但我无法准确地指出发生这种情况时,
BufferReader
中的确切位置。我可以在调试器中看到,在我的设备上读取文件的第一行和第二行,但我认为此时创建节点对象或更新进度是在抛出
异常时。感谢您的帮助

package com.example.george.droidscanner;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    Button btnRead;
    TextView textResult;

    ListView listViewNode;
    ArrayList<Node> listNote;
    ArrayAdapter<Node> adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btnRead = (Button)findViewById(R.id.readclient);
        textResult = (TextView)findViewById(R.id.result);

        listViewNode = (ListView)findViewById(R.id.nodelist);
        listNote = new ArrayList<>();
        ArrayAdapter<Node> adapter = new ArrayAdapter<Node>(
                        MainActivity.this,
                        android.R.layout.simple_list_item_1,
                        listNote);
        listViewNode.setAdapter(adapter);

        btnRead.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new TaskReadAddresses(listNote, listViewNode).execute();
            }
        });
    }


    private class TaskReadAddresses extends AsyncTask<Void, Node, Void> {

        ArrayList<Node> array;
        ListView listView;

        TaskReadAddresses(ArrayList<Node> array, ListView v){
            listView = v;
            this.array = array;
            array.clear();
            textResult.setText("querying...");
        }

        @Override
        protected Void doInBackground(Void... params) {
            readAddresses();
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            textResult.setText("Done");
        }

        @Override
        protected void onProgressUpdate(Node... values) {
            listNote.add(values[0]);
            ((ArrayAdapter)(listView.getAdapter())).notifyDataSetChanged();
        }

        private void readAddresses() {
            BufferedReader bufferedReader = null;

            try {
                bufferedReader = new BufferedReader(new FileReader("/proc/net/arp"));

                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    String[] splitted = line.split(" +");
                    if (splitted != null && splitted.length >= 4) {
                        String ip = splitted[0];
                        String mac = splitted[3];
                        if (mac.matches("..:..:..:..:..:..")) {
                            Node thisNode = new Node(ip, mac);
                            publishProgress(thisNode);
                        }
                    }
                }

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally{
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
XML文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    android:orientation="vertical"
    tools:context="com.example.george.droidscanner.MainActivity">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:autoLink="web"
        android:text="http://android-er.blogspot.com/"
        android:textStyle="bold" />

    <Button
        android:id="@+id/readclient"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAllCaps="false"
        android:text="Read Ip/MAC addresses"/>

    <TextView
        android:id="@+id/result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:typeface="monospace"
        android:textSize="24sp"/>

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/nodelist">

    </ListView>

</LinearLayout>

运行时异常错误

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
                  Process: com.example.george.droidscanner, PID: 18522
                  java.lang.RuntimeException: An error occured while executing doInBackground()
                      at android.os.AsyncTask$3.done(AsyncTask.java:304)
                      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
                      at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
                      at java.util.concurrent.FutureTask.run(FutureTask.java:242)
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
                      at java.lang.Thread.run(Thread.java:818)
                   Caused by: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
                      at java.net.InetAddress.lookupHostByName(InetAddress.java:451)
                      at java.net.InetAddress.getLocalHost(InetAddress.java:396)
                      at com.example.george.droidscanner.Node.queryHost(Node.java:44)
                      at com.example.george.droidscanner.Node.<init>(Node.java:24)
                      at com.example.george.droidscanner.MainActivity$TaskReadAddresses.readAddresses(MainActivity.java:95)
                      at com.example.george.droidscanner.MainActivity$TaskReadAddresses.doInBackground(MainActivity.java:67)
                      at com.example.george.droidscanner.MainActivity$TaskReadAddresses.doInBackground(MainActivity.java:53)
                      at android.os.AsyncTask$2.call(AsyncTask.java:292)
                      at java.util.concurrent.FutureTask.run(FutureTask.java:237)
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                      at java.lang.Thread.run(Thread.java:818) 
                   Caused by: android.system.GaiException: android_getaddrinfo failed: EAI_NODATA (No address associated with hostname)
                      at libcore.io.Posix.android_getaddrinfo(Native Method)
                      at libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
                      at java.net.InetAddress.lookupHostByName(InetAddress.java:438)
                      at java.net.InetAddress.getLocalHost(InetAddress.java:396) 
                      at com.example.george.droidscanner.Node.queryHost(Node.java:44) 
                      at com.example.george.droidscanner.Node.<init>(Node.java:24) 
                      at com.example.george.droidscanner.MainActivity$TaskReadAddresses.readAddresses(MainActivity.java:95) 
                      at com.example.george.droidscanner.MainActivity$TaskReadAddresses.doInBackground(MainActivity.java:67) 
                      at com.example.george.droidscanner.MainActivity$TaskReadAddresses.doInBackground(MainActivity.java:53) 
                      at android.os.AsyncTask$2.call(AsyncTask.java:292) 
                      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                      at java.lang.Thread.run(Thread.java:818) 
E/AndroidRuntime:致命异常:异步任务#1
进程:com.example.george.droidscanner,PID:18522
java.lang.RuntimeException:执行doInBackground()时出错
在android.os.AsyncTask$3.done处(AsyncTask.java:304)
位于java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
位于java.util.concurrent.FutureTask.setException(FutureTask.java:222)
位于java.util.concurrent.FutureTask.run(FutureTask.java:242)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
运行(Thread.java:818)
原因:java.lang.SecurityException:权限被拒绝(缺少INTERNET权限?)
位于java.net.InetAddress.lookupHostByName(InetAddress.java:451)
位于java.net.InetAddress.getLocalHost(InetAddress.java:396)
位于com.example.george.droidscanner.Node.queryHost(Node.java:44)
位于com.example.george.droidscanner.Node.(Node.java:24)
位于com.example.george.droidscanner.MainActivity$TaskReadAddresses.readAddresses(MainActivity.java:95)
位于com.example.george.droidscanner.MainActivity$taskreaddresses.doInBackground(MainActivity.java:67)
位于com.example.george.droidscanner.MainActivity$taskreaddresses.doInBackground(MainActivity.java:53)
在android.os.AsyncTask$2.call(AsyncTask.java:292)
位于java.util.concurrent.FutureTask.run(FutureTask.java:237)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
运行(Thread.java:818)
原因:android.system.gai异常:android\u getaddrinfo失败:EAI\u NODATA(没有与主机名关联的地址)
位于libcore.io.Posix.android_getaddrinfo(本机方法)
位于libcore.io.ForwardingOs.android_getaddrinfo(ForwardingOs.java:55)
位于java.net.InetAddress.lookupHostByName(InetAddress.java:438)
位于java.net.InetAddress.getLocalHost(InetAddress.java:396)
位于com.example.george.droidscanner.Node.queryHost(Node.java:44)
位于com.example.george.droidscanner.Node.(Node.java:24)
位于com.example.george.droidscanner.MainActivity$TaskReadAddresses.readAddresses(MainActivity.java:95)
位于com.example.george.droidscanner.MainActivity$taskreaddresses.doInBackground(MainActivity.java:67)
位于com.example.george.droidscanner.MainActivity$taskreaddresses.doInBackground(MainActivity.java:53)
在android.os.AsyncTask$2.call(AsyncTask.java:292)
位于java.util.concurrent.FutureTask.run(FutureTask.java:237)
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
运行(Thread.java:818)

在清单中添加此行:

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

如您在日志中所见。这是由于

原因:java.lang.SecurityException:权限被拒绝(缺少INTERNET权限?)

将以下权限添加到AndroidManifest

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


这是问题之一,但不是主要问题。注意,在这之前有一个例外。你运行它并工作了吗?。。。因为我刚刚添加了权限,但仍然有例外我很糟糕,我在错误的地方添加了权限。。。谢天谢地,我在错误的地方添加了权限。。。谢谢
<uses-permission android:name="android.permission.INTERNET" />