简体   繁体   中英

How to use method from other class in Activity

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?

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)

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM