【问题标题】:Parsing a text file in android from an HTML从 HTML 解析 android 中的文本文件
【发布时间】:2016-06-26 19:25:56
【问题描述】:

所以我一直在努力解决这个问题,结果碰了壁。当它开始处理时,它总是给我一个致命的错误。
所以基本上我想从互联网上读取一个文本文件,然后解析它,这样我就可以开始把它分开并使用 JSON 解析器来处理 JSON 数据。但这更进一步(我已经构建了部分)。我只是在连接和下载数据时遇到问题。我只想读入文本文件,然后再次打印出来。 感谢您对此提供的任何帮助。

这就是它给我的东西

01-26 15:11:48.373 1958-1958/com.example.mmillar.urljsonparser I/art: 未启用后期 -Xcheck:jni(已启用) 01-26 15:11:48.556 1958-1958/com.example.mmillar.urljsonparser D/HTML P1::http://textfiles.com/100/914bbs.txt 01-26 15:11:48.556 1958-1958/com.example.mmillar.urljsonparser D/HTML P2::http://textfiles.com/100/914bbs.txt 01-26 15:11:48.557 1958-1958/com.example.mmillar.urljsonparser D/HTML inJSON::http://textfiles.com/100/914bbs.txt 01-26 15:11:48.569 1958-1958/com.example.mmillar.urljsonparser D/Status:: 连接打开 01-26 15:11:48.569 1958-1958/com.example.mmillar.urljsonparser D/Status:: 关闭连接 01-26 15:11:48.569 1958-1958/com.example.mmillar.urljsonparser D/AndroidRuntime: 关闭虚拟机 01-26 15:11:48.570 1958-1958/com.example.mmillar.urljsonparser E/AndroidRuntime: 致命异常: main 进程:com.example.mmillar.urljsonparser,PID:1958 java.lang.RuntimeException:无法启动活动 ComponentInfo{com.example.mmillar.urljsonparser/com.example.mmillar.urljsonparser.MainActivity}:android.os.NetworkOnMainThreadException 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 在 android.app.ActivityThread.access$800(ActivityThread.java:151) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 引起:android.os.NetworkOnMainThreadException 在 android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147) 在 java.net.InetAddress.lookupHostByName(InetAddress.java:418) 在 java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 在 java.net.InetAddress.getAllByName(InetAddress.java:215) 在 com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29) 在 com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232) 在 com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124) 在 com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272) 在 com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211) 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382) 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:332) 在 com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:199) 在 com.example.mmillar.urljsonparser.JSONParser.getStream(JSONParser.java:40) 在 com.example.mmillar.urljsonparser.MainActivity.onCreate(MainActivity.java:24) 在 android.app.Activity.performCreate(Activity.java:5990) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 在 android.app.ActivityThread.access$800(ActivityThread.java:151) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 01-26 15:11:53.474 1958-1958/? I/Process:发送信号。 PID:1958 SIG:9

所以我有点迷失在哪里出了问题。我想我已经准备好了一切并且进展顺利。像 inputstream、bufferreader 等等。这就是我所拥有的。

这是解析器程序

public class JSONParser extends AsyncTask<String, Void, String>{

@Override
protected String doInBackground(String... inputUrl) {
    getStream(inputUrl[0]);
    return null;
}

public void getStream(String urlString)
{
    Log.d("HTML inJSON: ", urlString );
    //variables for the connection and downloading the JSON data
    URL url = null;
    HttpURLConnection urlConnection = null;
    InputStream inputStream = null;

    try {
        url = new URL(urlString);
        urlConnection = (HttpURLConnection)url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.connect();
        Log.d("Status:","Connection Opened");
        //read in the data
        BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
        //build the data for parsing
        StringBuilder myString = new StringBuilder();
        String line;
        while((line = br.readLine()) !=null)
        {
            myString.append(line);
        }
        Log.d("Status:"," JSON loaded into string");
        Log.d("Total:", myString.toString());


    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if (urlConnection != null)
        {
            //close the connection
            urlConnection.disconnect();
            Log.d("Status:", " Closing connection");
        }
    }
}

}

这是我刚刚运行的主程序,因为我只想从文件输出到控制台,我只是想确保它正常工作。

public class MainActivity extends AppCompatActivity {
//http://textfiles.com/100/914bbs.txt
private String testHtml = "http://textfiles.com/100/914bbs.txt";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d("HTML P1: ", testHtml );
    JSONParser jp = new JSONParser();
    Log.d("HTML P2: ", testHtml );
    jp.getStream(testHtml);
    Log.d("HTML P3: ", testHtml);


}

【问题讨论】:

    标签: java android html parsing


    【解决方案1】:

    而不是使用

    jp.getStream(testHtml); 
    

    使用

    jp.execute("stream url here");
    

    目前您正尝试在您的Asynctask 中创建一个函数,但没有利用AsyncTask 的使用。它仍然尝试在 mainThread 上创建一个 HttpConnection,这会引发异常。

    【讨论】:

    • 感谢工作,好的,我明白了为什么,我认为主线程无法建立连接,因为它没有所有的 URL 链接和内容。或者是因为有一个已经打开然后它只是关闭那个并给出错误?再次感谢您
    • 很高兴我能提供任何帮助。 :) 出现问题是因为默认情况下,Android ThreadPolicy 会阻止 UI 线程上的任何网络使用。可以使用以下 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build() 绕过它StrictMode.setThreadPolicy(policy);但一般不建议在 UI 线程上调用任何网络操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多