java - 无法下载网页内容

标签 java android-asynctask httpsurlconnection

我是java和android新手,作为我正在做的类(class)的一部分,我必须将网页内容下载到日志中。但是我无法让它工作。我收到错误: 无法启动 Activity ComponentInfo 空指针异常

我使用的是 Android Studio 3.5

谢谢。

我已尝试根据类(class)代码检查该代码并且它匹配。

    package com.android.guessthecelebrity;

import androidx.appcompat.app.AppCompatActivity;

import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.concurrent.ExecutionException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MainActivity extends AppCompatActivity {


    public class downloadTask extends AsyncTask<String, Void, String>{
        @Override
        protected String doInBackground(String... urls) {
        String result = "";
        URL url;
        HttpURLConnection urlConnection = null;

        try {
            url = new URL(urls[0]);
            urlConnection = (HttpURLConnection)url.openConnection();
            InputStream in = urlConnection.getInputStream();

            InputStreamReader reader = new InputStreamReader(in);
            int data  = reader.read();

            while (data != -1) {

                char current = (char)data;
                result += current;
                data= reader.read();
            }

        }catch (Exception e) {
            e.printStackTrace();
        }

        return null;
        }
    }


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        downloadTask task = new downloadTask();
        String result = null;
        try {
            result = task.execute("http://www.posh24.se/kandisar").get();

            String [] splitResult = result.split("<div class=\"sidebarContainer\">");
            Pattern p = Pattern.compile("src=\"(.*?)\"");
            Matcher m = p.matcher(splitResult[0]);// [0] refers to the part before the split point

            while (m.find()) {
                System.out.println(m.group(1));

            }

            p = Pattern.compile("alt=\"(.*?)\"");
            m = p.matcher(splitResult[0]);// [0] refers to the part before the split point


            System.out.println(m.group(1));

        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }


    }
}

我期望将网页内容返回到Log

最佳答案

好吧,奥利弗,让我在你被恶搞之前帮助你,因为你是新来的,

欢迎来到 StackOverflow :)

问题中没有太多错误日志,但是该错误确实告诉您其中一个对象未​​初始化,因此您得到 NullPointerException (欢迎来到java中最常见的错误)。

我整理了一些可以帮助您的代码。

有几点需要注意,

  • 确保您的 Activity 存在于 AndroidManifest.xml 文件中。
  • 这是<uses-permission android:name="android.permission.INTERNET" />存在于您的 AndroidManifest.xml 文件中。

    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.util.Log;
    import android.widget.TextView;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.nio.charset.StandardCharsets;
    
    import your.package.name.R;
    
    
    public class GetWebContentActivity extends AppCompatActivity {
    
    
    
    private static final String TAG = "GetWebContent";
    
    private TextView webContentTextView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_get_web_content);
        setSupportActionBar(findViewById(R.id.toolbar));
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    
        webContentTextView = findViewById(R.id.web_content_text_view);
        (new GetWebContent()).execute("https://www.google.com/"); //argument is the website link
    
    }
    
    class GetWebContent extends AsyncTask<String, Void, String> {
    
        private String webContentResult = "Couldn't get web content";
    
        @Override
        protected String doInBackground(String... strings) {
    
            String urlOfTheWebsite = strings[0];
    
            try {
                URL url = new URL(urlOfTheWebsite);
    
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
    
                InputStream inputStream = httpURLConnection.getInputStream();
    
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
    
                String tempText = null;
                StringBuilder stringBuilder = new StringBuilder();
                while ((tempText = bufferedReader.readLine()) != null) {
                    stringBuilder.append(tempText);
                }
    
                webContentResult = stringBuilder.toString();
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return webContentResult;
        }
    
        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
    
            Log.d(TAG, "" + s); // you may log the web content like this
            //or
            webContentTextView.setText("" + s); // print this on UI
        }
    
    }
    }
    

  • 请尝试检查您在 Google (StackOverflow) 上收到的每个错误
  • 尝试为您的编码考虑一个严格的反馈循环,当您得到它们时,您会尽快发现任何错误。
  • 如果您是 Java 新手,请考虑一些教程 ( Practical Programming )。
  • Java 是一种类型化语言,如果您正在学习编程,这是一个很好的起点,但是如果您想坚持使用 Android,请考虑转向 Kotlin 语言
  • 在提问之前先做一点功课,这在 Stack-overflow 中会有所收获,
  • 请尽可能帮助他人。

关于java - 无法下载网页内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58043404/

相关文章:

java - 使用 ScheduledExecutorService 的测试代码(不使用 Sleep)

java - Google Drive Android API OAuth 身份验证问题 - onActivityResult 返回 "0"

android - 带有 ProgressDialog 的 AsyncTask 与方向更改

android - 在请求时完成 AsyncTask

android - 等待 AsyncTask 获取数据并在那之后在 UI 线程中做一些事情

android - Android 中的自签名证书

Java - 三角形的递归和

java - 为什么说: "Checked exceptions are not forwarded in calling chain (propagated)"?

java - 如何在 android 中为 HttpsUrlConnection 禁用 SSLv3?

Java HttpsURLConnection - TwitchAPI - 更新 channel 信息