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 } } 

Apologies for the long code, but I figured I should just post it all so I don't have to post it later. What is happening is the urlParse method is not working, specifically on line 82 (Not exactly line 82 since I deleted some comments before posting). Does anybody see what the issue is?

LogCat Posted below:

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) 

1 Answer 1

2

This question arises on Stack Overflow almost every two days. It is because you cannot touch network from main thread. See my answer at

Unfortunately, Msger has stopped. FATAL Exception: main

Create a new class inside your RoutesActivity as

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 } } } 

Change the following

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

to

new MyInnerClass().execute(url); 
Sign up to request clarification or add additional context in comments.

6 Comments

Sorry, I'm a newbie at Android (not that much more experienced in Java either), could you show me how to perform this in a different class?
see my updated answer, I haven't tested it. But that is something you will have to do if you wana access network. Also make sure you have added INTERNET permission in the manifest
"The type MyInnerClass must implement the inherited abstract method AsyncTask<String,Void,String>.doInBackground(String...)" I fixed all the minor errors but now I'm getting this.
After doing what you suggested, it gave me an error about params not being a String, so I changed it to params[0]. The error I'm getting now is that I need an IOException. How do I add this to the class, since try/catch wants to seperate "Document doc" (=) from "conn.get();
One more quick question: If I want to populate another Spinner with the results of directions, do I create a new method in the main class, and then call it in onPostExecute? And how would I transfer directions to onPostExecute?
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.