【问题标题】:How to download source code of website in java如何在java中下载网站的源代码
【发布时间】:2020-05-16 11:52:20
【问题描述】:

我是 android 开发和编程的新手。我正在网上学习一些关于 android 开发的教程,我想在我的应用程序中以字符串形式下载网站源代码进行处理,但我无法这样做。有时应用程序需要将近 5 到 10 分钟才能得到响应,但我的应用程序仍然无法正确连接下面是我使用的代码。 请帮忙 并请提供一些故障排除方法

Java 代码:

package com.example.webapp1;

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.URL;
import java.net.URLConnection;
import java.util.concurrent.ExecutionException;

public class MainActivity extends AppCompatActivity {

public class DownloadTask extends AsyncTask<String,Void,String>
{

    @Override
    protected String doInBackground(String... strings) {
        String result = "";
        URL url;
        URLConnection urlConnection = null;
        try {
                url = new URL(strings[0]);
                urlConnection =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();
                 }

                 return result;

        }
        catch (Exception e)
        {
            e.getStackTrace();
            return "failed";
        }

    }
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    String result =null;
    DownloadTask task = new DownloadTask();
    try {
        result = task.execute("https://www.imdb.com/list/ls052283250/").get();
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    Log.i("result content",result);
}
}

Android Mainfest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.webapp1">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

【问题讨论】:

    标签: java android


    【解决方案1】:

    您的代码中有很多错误,您似乎缺少使用 Java、文件和 Android API 的基础知识。

    我建议在谷歌上搜索一些初学者教程,但我没有具体的推荐。

    以下是代码中的问题:

    1. 您通过将int 变量添加到String 来累积结果的方法不正确。
      它将添加数值而不是值所代表的字符。
      例如,您的字符串将包含“60”,而不是“ 您应该使用ByteBuffer 或类似名称。

    2. 您没有正确处理返回值: 您无法直接从 execute 方法返回后台(异步)任务的值。
      您必须 read the documentation 学习如何使用 AsyncTask 类。
      要处理doInBackground的返回值,必须实现onPostExecute方法!

    Android Studio 和 Android OS 提供了多种工具来解决代码问题。
    最基本的是记录:you can use Log class 将信息写入工作室可以显示的logcat

    另外,Android Studio comes with a debugger

    【讨论】:

    • 但我只在循环内读取字节( data = reader.read();)
    • @LakshyaDujari 你是对的,我错过了循环内的读取行。我编辑了我的答案,但请检查其余问题。
    【解决方案2】:

    @LevM 再次感谢我已经用以下代码替换了现有代码,但我仍然没有获得网站的完整源代码

     try
            {
                URL url = new URL(urls[0]);
                HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
                InputStream inputStream = urlConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
                String inputLine;
                StringBuilder stringBuilder = new StringBuilder();
                while ((inputLine = bufferedReader.readLine())!=null)
                {
                    stringBuilder.append(inputLine);
                }
                bufferedReader.close();
                urlConnection.disconnect();
                return stringBuilder.toString();
            }
            catch (MalformedURLException e)
            {
                e.printStackTrace();
                return "Failed";
            }
            catch (IOException e)
            {
                e.printStackTrace();
                return  "Failed";
            }
        }
    

    【讨论】:

    • 但是你得到了什么?你实现onPostExecute了吗?
    • 那你永远不会得到onDoInBackground的结果!结果被传递到onPostExecute 它不是从execute 方法返回的。 execute 方法立即返回,但任务继续在后台运行。完成后,将调用 onPostExecute。阅读我在回答中提供的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多