Reputation: 59
I have two Activity in my android app:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Connection.Response response = new Second().get();
}
}
and:
public class Second extends Activity {
Connection.Response response = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
get();
}
public Connection.Response get()
{
try {
response = Jsoup.connect("http://example.com").execute();
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
}
Second activity working ok - I use method get in my class and this is good, but if I open MainActivity I have errors:
08-25 19:31:30.764: E/AndroidRuntime(999): FATAL EXCEPTION: main
08-25 19:31:30.764: E/AndroidRuntime(999): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.js/com.example.js.MainActivity}: android.os.NetworkOnMainThreadException
08-25 19:31:30.764: E/AndroidRuntime(999): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
08-25 19:31:30.764: E/AndroidRuntime(999): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
08-25 19:31:30.764: E/AndroidRuntime(999): at android.app.ActivityThread.access$600(ActivityThread.java:122)
08-25 19:31:30.764: E/AndroidRuntime(999): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
08-25 19:31:30.764: E/AndroidRuntime(999): at android.os.Handler.dispatchMessage(Handler.java:99)
08-25 19:31:30.764: E/AndroidRuntime(999): at android.os.Looper.loop(Looper.java:137)
08-25 19:31:30.764: E/AndroidRuntime(999): at android.app.ActivityThread.main(ActivityThread.java:4340)
08-25 19:31:30.764: E/AndroidRuntime(999): at java.lang.reflect.Method.invokeNative(Native Method)
08-25 19:31:30.764: E/AndroidRuntime(999): at java.lang.reflect.Method.invoke(Method.java:511)
08-25 19:31:30.764: E/AndroidRuntime(999): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
08-25 19:31:30.764: E/AndroidRuntime(999): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
08-25 19:31:30.764: E/AndroidRuntime(999): at dalvik.system.NativeStart.main(Native Method)
08-25 19:31:30.764: E/AndroidRuntime(999): Caused by: android.os.NetworkOnMainThreadException
08-25 19:31:30.764: E/AndroidRuntime(999): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
08-25 19:31:30.764: E/AndroidRuntime(999): at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
08-25 19:31:30.764: E/AndroidRuntime(999): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
08-25 19:31:30.764: E/AndroidRuntime(999): at java.net.InetAddress.getAllByName(InetAddress.java:220)
08-25 19:31:30.764: E/AndroidRuntime(999): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
08-25 19:31:30.764: E/AndroidRuntime(999): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
08-25 19:31:30.764: E/AndroidRuntime(999): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
08-25 19:31:30.764: E/AndroidRuntime(999): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
08-25 19:31:30.764: E/AndroidRuntime(999): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
08-25 19:31:30.764: E/AndroidRuntime(999): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
08-25 19:31:30.764: E/AndroidRuntime(999): at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
08-25 19:31:30.764: E/AndroidRuntime(999): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
08-25 19:31:30.764: E/AndroidRuntime(999): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
08-25 19:31:30.764: E/AndroidRuntime(999): at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
08-25 19:31:30.764: E/AndroidRuntime(999): at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:425)
08-25 19:31:30.764: E/AndroidRuntime(999): at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:410)
08-25 19:31:30.764: E/AndroidRuntime(999): at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:164)
08-25 19:31:30.764: E/AndroidRuntime(999): at com.example.js.Second.get(Second.java:27)
08-25 19:31:30.764: E/AndroidRuntime(999): at com.example.js.MainActivity.onCreate(MainActivity.java:15)
08-25 19:31:30.764: E/AndroidRuntime(999): at android.app.Activity.performCreate(Activity.java:4465)
08-25 19:31:30.764: E/AndroidRuntime(999): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
08-25 19:31:30.764: E/AndroidRuntime(999): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
08-25 19:31:30.764: E/AndroidRuntime(999): ... 11 more
Second.java:27 : response = Jsoup.connect("http://example.com").execute();
MainActivity.java:15 : Connection.Response response = new Second().get();
How can I make it?
Upvotes: 0
Views: 73
Reputation: 1751
Oh god, where to start... well, for one. You only need activities to transitions between UI pages. It looks, what you are trying to achieve here is simply one activity calling a method in another class.
So in your case, I would not let Second
extend from Activity
.
And what you are doing in Second
is making a network call. You cannot make network calls from the main thread, you better use an AsyncTask AND you need to add a permission to your manifest
indicating you need network access
Upvotes: 1
Reputation: 39992
You cannot access the network on the Main Thread. This is to prevent your UI's rendering from being blocked by a long running call to the network. You need to put the network logic in its own thread. I recommend using an AsyncTask.
Also, you should not create your own Activity this way. If you need two Activities to communicate. Use startActivityForResult and setResult to pass data back and forth using the Intent's data bundle.
By the looks of it, you are using the Second Activity purely for data retrieval. You should consider doing this in a Service instead. You will still need to handle threading in the Service (or you can use an IntentService)
Upvotes: 1