Android获取网站内容/源代码

Android获取网站内容/源代码,android,Android,我进入项目,需要得到网站的源代码。因此,我从Mark B获得了代码回答: 问题是,HttpClient、HttpGet、HttpResponse现在已被弃用 所以我将其更改为HttpURLConnection,但运气不好,它会强制关闭 URL url = new URL("http://google.com"); HttpURLConnection response = (HttpURLConnection) url.openConnection(); String h

我进入项目,需要得到网站的源代码。因此,我从Mark B获得了代码回答:

问题是,HttpClient、HttpGet、HttpResponse现在已被弃用

所以我将其更改为HttpURLConnection,但运气不好,它会强制关闭

    URL url = new URL("http://google.com");
    HttpURLConnection response = (HttpURLConnection) url.openConnection();

    String html = "";
    InputStream in = response.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    StringBuilder str = new StringBuilder();
    String line = null;
    while((line = reader.readLine()) != null){
        str.append(line);
    }
    in.close();
    html = str.toString();
    return html;
这有什么问题? 这是我的追踪

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.listview_load_data_from_json/com.kaleidosstudio.listview_load_data_from_json.MainActivity}: android.os.NetworkOnMainThreadException
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2319)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2370)
        at android.app.ActivityThread.access$800(ActivityThread.java:155)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5426)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
        at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:126)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1156)
        at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
        at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
        at java.net.InetAddress.getAllByName(InetAddress.java:214)
        at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
        at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
        at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
        at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
        at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
        at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
        at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
        at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
        at com.kaleidosstudio.listview_load_data_from_json.GetMP3.getJSON(GetMP3.java:49)
        at com.kaleidosstudio.listview_load_data_from_json.GetMP3.GetMP3_9Cloud(GetMP3.java:34)
        at com.kaleidosstudio.listview_load_data_from_json.MainActivity.onCreate(MainActivity.java:52)
        at android.app.Activity.performCreate(Activity.java:5296)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2283)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2370)
        at android.app.ActivityThread.access$800(ActivityThread.java:155)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5426)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
        at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:126)
        at dalvik.system.NativeStart.main(Native Method)

您正在主线程中调用这些函数。现在,他们有两种可能的方法来解决这个问题

  • AsyncTask:AsyncTask允许正确、轻松地使用UI线程。此类允许在UI线程上执行后台操作和发布结果,而无需操纵线程和/或处理程序。这里有一个参考

  • 线程:线程是一个并发执行单元。对于被调用的方法、它们的参数和局部变量,它有自己的调用堆栈。每个应用程序在启动时至少有一个线程在主线程组中运行,即主线程。运行时在系统线程组中保留自己的线程

  • 在新线程中执行代码有两种方法。您可以将Thread子类化并重写其run()方法,也可以构造一个新线程并将Runnable传递给构造函数。在任何一种情况下,都必须调用start()方法来实际执行新线程


    每个线程都有一个整数优先级,它影响操作系统调度线程的方式。新线程继承其父线程的优先级。可以使用setPriority(int)方法设置线程的优先级。这里是一个快速参考

    您将获得一个
    NetworkOnMainThreadException
    。这意味着你不能在主UI线程上发送Http请求。你必须在后台线程中完成所有这些

    下面是一个简单的示例,说明如何执行此操作:

    public class WebsiteDataWorker extends AsyncTask<String, Void, Void> {
        public String html;
    
        @Override
        private void doInBackground(String... params) {
            URL url = params[0];
            HttpURLConnection response = (HttpURLConnection) url.openConnection();
    
            String html = "";
            InputStream in = response.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder str = new StringBuilder();
            String line = null;
            while((line = reader.readLine()) != null){
                str.append(line);
            }
            in.close();
            html = str.toString();
        }
    }
    
    私有类注册AsyncTask扩展AsyncTask{
    进程对话;
    @凌驾
    受保护的void onPreExecute(){
    dialog=新建ProgressDialog(MainActivity.this);
    dialog.setTitle(“注册”);
    setMessage(“正在注册…”);
    对话框。可设置可取消(false);
    dialog.show();
    }
    @凌驾
    受保护字符串doInBackground(无效…参数){
    试一试{
    response=HttpClientWrapper.getResponseGET(“您的url放在这里”);
    Log.e(标签“响应:”+响应);
    }捕获(例外e){
    e、 printStackTrace();
    this.error=e.getMessage();
    }
    返回响应;
    }
    @凌驾
    受保护的void onPostExecute(字符串结果){
    Log.e(标签“结果:+响应”);
    if(dialog.isShowing()){
    dialog.dismise();
    }
    }}
    
    使用此异步任务

    public static String getResponseGET(String url) {
    String response = "";
    HttpURLConnection c = null;
    
    try {
        URL u = new URL(url);
        c = (HttpURLConnection) u.openConnection();
        c.setRequestMethod("GET");
        c.setConnectTimeout(15000);
        c.setReadTimeout(15000);
    
        c.connect();
        int status = c.getResponseCode();
    
        switch (status) {
            case 200:
            case 201:
                BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = br.readLine()) != null) {
                    sb.append(line+"\n");
                    response = sb.toString().substring(0, sb.toString().length() - 1);
                }
                br.close();
                return response;
        }
    
    } catch (IOException ex) {
        if (c != null) {
            c.disconnect();
        }
    } finally {
        if (c != null) {
            try {
                c.disconnect();
            } catch (Exception ex) {
    
            }
        }
    }
    return null;}
    

    使用此http调用GET方法

    您得到的错误是什么?我得到了这个消息。请在问题中发布您的堆栈跟踪。请不要在场外链接到它。它已过时,请在调用后台函数时在execute方法中添加url,然后在后台再次添加method@M.S.P啊!!我忽略了这一点。谢谢你指出它,它迫使我们靠近。我得到一个错误:Rahul,请把你的帖子合并成一个答案。他们看起来像是两个不同的答案,OP仍然得到相同的例外情况就证明了这一点。是否添加了许可?
    public class WebsiteDataWorker extends AsyncTask<String, Void, Void> {
        public String html;
    
        @Override
        private void doInBackground(String... params) {
            URL url = params[0];
            HttpURLConnection response = (HttpURLConnection) url.openConnection();
    
            String html = "";
            InputStream in = response.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            StringBuilder str = new StringBuilder();
            String line = null;
            while((line = reader.readLine()) != null){
                str.append(line);
            }
            in.close();
            html = str.toString();
        }
    }
    
    WebsiteDataWorker worker = new WebsiteDataWorker();
    worker.execute("http://google.com");
    String html = worker.html;
    //do whatever stuff you want with the html variable
    
    private class RegistrationAsyncTask extends AsyncTask<Void, Void, String> {
    ProgressDialog dialog;
    
    @Override
    protected void onPreExecute() {
        dialog = new ProgressDialog(MainActivity.this);
        dialog.setTitle("Registration");
        dialog.setMessage("Registration in process...");
        dialog.setCancelable(false);
        dialog.show();
    }
    
    @Override
    protected String doInBackground(Void... params) {
        try {
    
            response = HttpClientWrapper.getResponseGET("Your url put here");
            Log.e(TAG, "Response: " + response);
        } catch (Exception e) {
            e.printStackTrace();
            this.error = e.getMessage();
        }
        return response;
    }
    
    @Override
    protected void onPostExecute(String result) {
        Log.e(TAG, "result: " + response);
    
        if (dialog.isShowing()) {
            dialog.dismiss();
        }
    }}
    
    public static String getResponseGET(String url) {
    String response = "";
    HttpURLConnection c = null;
    
    try {
        URL u = new URL(url);
        c = (HttpURLConnection) u.openConnection();
        c.setRequestMethod("GET");
        c.setConnectTimeout(15000);
        c.setReadTimeout(15000);
    
        c.connect();
        int status = c.getResponseCode();
    
        switch (status) {
            case 200:
            case 201:
                BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
                StringBuilder sb = new StringBuilder();
                String line;
                while ((line = br.readLine()) != null) {
                    sb.append(line+"\n");
                    response = sb.toString().substring(0, sb.toString().length() - 1);
                }
                br.close();
                return response;
        }
    
    } catch (IOException ex) {
        if (c != null) {
            c.disconnect();
        }
    } finally {
        if (c != null) {
            try {
                c.disconnect();
            } catch (Exception ex) {
    
            }
        }
    }
    return null;}