Android:尝试获取 URL 时 jsoup 失败

标签 android jsoup

    package com.nicotera.colton.londontransitguide;

import java.io.IOException;
import java.text.DecimalFormat;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.*;
import org.jsoup.nodes.Attributes;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class RoutesActivity extends Activity implements OnItemSelectedListener {
    private static final String TAG = "RoutesActivity";

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_routes);

        Spinner spinner = (Spinner) findViewById(R.id.route_name_spinner); // Create an ArrayAdapter using the string array and a default spinner layout
        spinner.setOnItemSelectedListener(this);
        ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.routes_array, android.R.layout.simple_spinner_item);
        // Specify the layout to use when the list of choices appears
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // Apply the adapter to the spinner
        spinner.setAdapter(adapter);
        Log.i(TAG, "spinner populated");
    }

    public void onItemSelected(AdapterView<?> parent, View view, 
            int pos, long id) {
        Log.i(TAG, "Item selected");
        int tempPos = pos;
        Log.i(TAG, ("Position of selected item: " + tempPos));
        int routeSelected;
        if (tempPos < 17)
            routeSelected = (tempPos + 1);
        else if (tempPos >= 17 && tempPos < 29)
            routeSelected = (tempPos + 2);
        else
            routeSelected = (tempPos + 3);
        String temp;
        if (routeSelected < 10)
            temp = ("0") + routeSelected;
        else
            temp = ("") + routeSelected;
        String url = "http://www.ltconline.ca/WebWatch/MobileAda.aspx?r=" + temp;
        try {
            urlParse(url);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void urlParse (String url) throws IOException {
        Log.i(TAG, "Tried to parse url");
        String [] directions = new String [3];
        String [] directionNames = new String [3];
        Pattern routeDirPattern = Pattern.compile("\\&d=(\\d{1,2})");
        Connection conn = Jsoup.connect(url);
        /*LINE 82 */ Document doc = conn.get();
        int i = 0;
        Elements routeLinks = doc.select("a[href]");
        for (Element routeLink : routeLinks) {
            i = (i + 1);
            String name = routeLink.text();
            Attributes attrs = routeLink.attributes();
            String href = attrs.get("href");
            Matcher m = routeDirPattern.matcher(href);
            if (m.find()) {
                    String number = m.group(1);
                    directions [i] = number;
                    directionNames [i] = name;
                    Log.i(TAG, directionNames [i]);
            }
        }

    }


    public void onNothingSelected(AdapterView<?> parent) {
        // Another interface callback
    }
}

很抱歉代码太长了,但我想我应该把它全部贴出来,这样我就不用以后再贴了。发生的事情是 urlParse 方法不起作用,特别是在第 82 行(不完全是第 82 行,因为我在发布前删除了一些评论)。有人知道问题出在哪里吗?

LogCat 发布如下:

12-08 20:39:38.384: I/RoutesActivity(765): Item selected
12-08 20:39:38.384: I/RoutesActivity(765): Position of selected item: 0
12-08 20:39:38.394: I/RoutesActivity(765): Tried to parse url
12-08 20:39:38.454: D/AndroidRuntime(765): Shutting down VM
12-08 20:39:38.484: W/dalvikvm(765): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
12-08 20:39:38.505: E/AndroidRuntime(765): FATAL EXCEPTION: main
12-08 20:39:38.505: E/AndroidRuntime(765): android.os.NetworkOnMainThreadException
12-08 20:39:38.505: E/AndroidRuntime(765):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)
12-08 20:39:38.505: E/AndroidRuntime(765):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
12-08 20:39:38.505: E/AndroidRuntime(765):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
12-08 20:39:38.505: E/AndroidRuntime(765):  at java.net.InetAddress.getAllByName(InetAddress.java:214)
12-08 20:39:38.505: E/AndroidRuntime(765):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70)
12-08 20:39:38.505: E/AndroidRuntime(765):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
12-08 20:39:38.505: E/AndroidRuntime(765):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:340)
12-08 20:39:38.505: E/AndroidRuntime(765):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87)
12-08 20:39:38.505: E/AndroidRuntime(765):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
12-08 20:39:38.505: E/AndroidRuntime(765):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:316)
12-08 20:39:38.505: E/AndroidRuntime(765):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:311)
12-08 20:39:38.505: E/AndroidRuntime(765):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:290)
12-08 20:39:38.505: E/AndroidRuntime(765):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:240)
12-08 20:39:38.505: E/AndroidRuntime(765):  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:81)
12-08 20:39:38.505: E/AndroidRuntime(765):  at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:408)
12-08 20:39:38.505: E/AndroidRuntime(765):  at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:393)
12-08 20:39:38.505: E/AndroidRuntime(765):  at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:159)
12-08 20:39:38.505: E/AndroidRuntime(765):  at org.jsoup.helper.HttpConnection.get(HttpConnection.java:148)
12-08 20:39:38.505: E/AndroidRuntime(765):  at com.nicotera.colton.londontransitguide.RoutesActivity.urlParse(RoutesActivity.java:82)
12-08 20:39:38.505: E/AndroidRuntime(765):  at com.nicotera.colton.londontransitguide.RoutesActivity.onItemSelected(RoutesActivity.java:62)
12-08 20:39:38.505: E/AndroidRuntime(765):  at android.widget.AdapterView.fireOnSelected(AdapterView.java:892)
12-08 20:39:38.505: E/AndroidRuntime(765):  at android.widget.AdapterView.access$200(AdapterView.java:49)
12-08 20:39:38.505: E/AndroidRuntime(765):  at android.widget.AdapterView$SelectionNotifier.run(AdapterView.java:860)
12-08 20:39:38.505: E/AndroidRuntime(765):  at android.os.Handler.handleCallback(Handler.java:725)
12-08 20:39:38.505: E/AndroidRuntime(765):  at android.os.Handler.dispatchMessage(Handler.java:92)
12-08 20:39:38.505: E/AndroidRuntime(765):  at android.os.Looper.loop(Looper.java:137)
12-08 20:39:38.505: E/AndroidRuntime(765):  at android.app.ActivityThread.main(ActivityThread.java:5039)
12-08 20:39:38.505: E/AndroidRuntime(765):  at java.lang.reflect.Method.invokeNative(Native Method)
12-08 20:39:38.505: E/AndroidRuntime(765):  at java.lang.reflect.Method.invoke(Method.java:511)
12-08 20:39:38.505: E/AndroidRuntime(765):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-08 20:39:38.505: E/AndroidRuntime(765):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-08 20:39:38.505: E/AndroidRuntime(765):  at dalvik.system.NativeStart.main(Native Method)

最佳答案

这个问题几乎每两天就会出现在 Stack Overflow 上。 这是因为您无法从主线程访问网络。 在

查看我的回答

Unfortunately, Msger has stopped. FATAL Exception: main

在您的 RoutesActivity 中创建一个新类

public class RoutesActivity extends Activity{



........ blah blah



private class MyInnerClass extends AsyncTask<String, Void, String> {

  String [] directions = new String [3];
  String [] directionNames = new String [3];     

   @Override
   protected void onPreExecute() {
   super.onPreExecute();

   }

   @Override
   protected String doInBackground(String... params) {
    try{
    Pattern routeDirPattern = Pattern.compile("\\&d=(\\d{1,2})");
    Connection conn = Jsoup.connect(params[0]);
    Document doc = conn.get();
    int i = 0;
    Elements routeLinks = doc.select("a[href]");
    for (Element routeLink : routeLinks) {
        i = (i + 1);
        String name = routeLink.text();
        Attributes attrs = routeLink.attributes();
        String href = attrs.get("href");
        Matcher m = routeDirPattern.matcher(href);
        if (m.find()) {
                String number = m.group(1);
                directions [i] = number;
                directionNames [i] = name;
                Log.i(TAG, directionNames [i]);
        }
    }
    }catch(Exception e){Log.d("doinbackground exception", e.toString());}
   return "Done";
   }

   @Override
   protected void onPostExecute(String result) {
   super.onPostExecute(result);
   // do whatever you wana do with directions[] and directionNames[] here
   }
}
}

更改以下内容

try {
        urlParse(url);
} catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
}

new MyInnerClass().execute(url);

关于Android:尝试获取 URL 时 jsoup 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13781812/

相关文章:

android - 在eclipse中如何创建一个新的cpp文件

android - 无法运行 aapt 命令 - 不断返回 "Android SDK Build-tools"

java - 创建一个简单、简单的游戏引擎

java - 在 JAVA 中使用 JSOUP 从 HTML 中提取 CSS 样式

android - 如何在 Android 中绘制图表?

java - 如何将 Spinner 对象传递给 Android/Java 中的其他 Activity

java - 如何使用 Jsoup 在 html 中查找并选择标签?

java - 专门用于下载图像和文件的网络爬虫

java - Jsoup(查找元素)

java - 解析以字符串形式找到的 HTML 转储的有效方法