程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

应用程序下载网页不工作

发布于2021-10-23 03:30     阅读(582)     评论(0)     点赞(18)     收藏(0)


我正在学习 android 开发,在一个教程中,我正在学习如何使用 AsyncTask 类下载网页并将其打印到日志中,但问题是,应用程序挂起(ui 元素既没有出现在模拟器中也没有出现在我的手机中)以及何时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 元素不受任务影响,对吗?


解决方案


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

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

并更新用户界面 onPostExecute

您还可以使用提高了代码StringBuffer,并BufferReader

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
        }
    }



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:http://www.qianduanheidong.com/blog/article/208447/2af3af09207d0b289522/

来源:前端黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

18 0
收藏该文
已收藏

评论内容:(最多支持255个字符)