应用下载网页不起作用

时间:2018-08-22 16:48:45

标签: java android html downloading

我正在学习android开发,在下面的教程中,我演示了如何下载网页并使用AsyncTask类将其打印到日志中,但问题是,应用程序已挂起(用户界面元素未出现在模拟器或手机中),并且当ui元素出现后(很长一段时间说了5分钟),日志中的html源未显示

这是代码

package com.example.slimshady.downloadhtml;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

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 javax.net.ssl.HttpsURLConnection;

public class MainActivity extends AppCompatActivity {

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

        @Override
        protected String doInBackground(String... buttoks) {

            URL url;
            HttpURLConnection httpURLConnection = null;
            String result = "";

            // try catch for if malformed url
            try {
                url = new URL(buttoks[0]);

                httpURLConnection = (HttpURLConnection)url.openConnection();

                InputStream in = httpURLConnection.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 downloadTask = new DownloadTask();
        try {
            String content = downloadTask.execute("https://www.google.com").get();
            Log.i("returned STring", content.toString());
        }catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

一切似乎都还可以,但是仍然没有html源日志记录,这是什么原因导致ui元素出现得比它们晚了很多?我的意思是AsyncTask的全部原因是它们独立于主线程运行,所以ui元素不受任务影响,对吗?

1 个答案:

答案 0 :(得分:2)

问题是,您正在调用get,这将阻塞您的线程,直到您获得响应为止,因此只需使用

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);    
    new DownloadTask().downloadTask.execute("https://www.google.com");
}

并更新onPostExecute

中的用户界面

您还可以使用StringBufferBufferReader来改进代码

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

        @Override
        protected String doInBackground(String... buttoks) {

            URL url;
            HttpURLConnection httpURLConnection = null;
            String result = "";
            StringBuffer buf = new StringBuffer(); 

            // try catch for if malformed url
            try {
                url = new URL(buttoks[0]);

                httpURLConnection = (HttpURLConnection)url.openConnection();

                InputStream in = httpURLConnection.getInputStream();

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

                if (is != null) {                            
                    while ((result = reader.readLine()) != null) {    
                        buf.append(result);
                    }                
                }

                return  buf.toString();

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

        }

        @Override
        ... onPostExecute(String str){
                // update UI here
        }
    }