android - 通过循环泄露数据

标签 android android-asynctask android-studio-2.0

我正在尝试通过 AsyncTask 下载网页的 html,然后在日志中显示该 html。

这是我的代码。但是,当我运行代码时,循环永远不会停止。

public class MainActivity extends AppCompatActivity {

    public class DownloadTask extends AsyncTask<String,Void,String>{
        @Override
        protected String doInBackground(String... urls) {

            String result = "";
            HttpURLConnection connection = null;
            URL myUrl;

            try{
                myUrl = new URL(urls[0]);
                connection = (HttpURLConnection) myUrl.openConnection();
                InputStream in = connection.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.printStackTrace();
                return "Failed";
            }
        }
    }


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

        DownloadTask task = new DownloadTask();
        try {
            String result = task.execute("http://www.posh24.com/celebrities").get();
            Log.i("asd",String.valueOf(result));
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

我的日志充满了:

D/dalvikvm: GC_FOR_ALLOC freed 297K, 20% free 2582K/3200K, paused 4ms, total 4ms

知道代码有什么问题吗?

最佳答案

您的代码的问题是,在使用单个 read() 调用对其进行初始化后,data 不会更改,因此它永远不会是 -1 (因此是无限循环)。

您需要在循环内调用read()

替换以下内容:

int data  = reader.read();
while(data != -1){
    // ...

像这样:

int data;
while ((data = reader.read()) != -1) {
    // ...

为了加快速度,您可以使用 BufferedReader:

BufferedReader reader = new BufferedReader(new InputStreamReader(in));

String line = null;
StringBuilder builder = new StringBuilder();

while((line = reader.readLine()) != null) {
    builder.append(line);
}

String data = builder.toString();

关于android - 通过循环泄露数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38106472/

相关文章:

android - 为什么从 Android NDK 中删除了 exec_elf.h?

android - 如何在 android studio 中更新 gradle?

java - @Before 注释在 espresso 测试中被 kotlin 忽略?

java - 使用 asynctask 进行网络连接

android - Adview Size Smart_Banner 在改变方向时损坏

bitbucket - Android Studio 2.0/2.1/3.0+ 不兼容 Bitbucket 插件 1.2.1

android - 错误 :Execution failed for task ':app:packageAllDebugClassesForMultiDex' in Android Studio

android - 自定义 GridView 适配器中的 TextView 不会更新,但 ImageView 会更新

java - 当互联网连接失败时,AsyncTask doInBackground 返回空指针异常

android - 从 Android Studio 运行应用程序时,在 Gradle 任务 processManifest.doLast 中编辑 AndroidManifest.xml 无效