2012-12-08 47 views
1
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行,因爲我在發佈之前刪除了一些評論)。有人看到問題是什麼嗎?Android:jsoup嘗試獲取URL時失敗

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) 

回答

2

這個問題就會出現堆棧溢出每兩天差不多。 這是因爲你不能觸摸主線程的網絡。 見我的答案在

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); 
+0

對不起,我是Android的新手(在Java中沒有那麼多的經驗),你能告訴我如何在不同的類中執行此操作嗎? – nicocolton

+0

看到我更新的答案,我還沒有測試過。但是,如果你使用網絡,那麼你將不得不這樣做。 此外,請確保您已在清單中添加INTERNET權限 –

+0

「MyInnerClass類型必須實現繼承的抽象方法AsyncTask .doInBackground(String ...)」我修復了所有小錯誤,得到這個。 – nicocolton