Java 应用程序下载网页不工作
我正在学习android开发,在下面的一个教程中,我演示了如何使用AsyncTask类下载网页并将其打印到日志中,但问题是,应用程序挂起(ui元素既不出现在emulator中,也不出现在我的手机中)以及当ui元素出现时(长时间后,比如5分钟)日志中的html源代码未显示 这是代码Java 应用程序下载网页不工作,java,android,html,download,Java,Android,Html,Download,我正在学习android开发,在下面的一个教程中,我演示了如何使用AsyncTask类下载网页并将其打印到日志中,但问题是,应用程序挂起(ui元素既不出现在emulator中,也不出现在我的手机中)以及当ui元素出现时(长时间后,比如5分钟)日志中的html源代码未显示 这是代码 package com.example.slimshady.downloadhtml; 导入android.os.AsyncTask; 导入android.support.v7.app.AppActivity; 导入a
package com.example.slimshady.downloadhtml;
导入android.os.AsyncTask;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Log;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.MalformedURLException;
导入java.net.URL;
导入javax.net.ssl.HttpsURLConnection;
公共类MainActivity扩展了AppCompatActivity{
公共类DownloadTask扩展了AsyncTask{
@凌驾
受保护的字符串背景(字符串…按钮){
网址;
HttpURLConnection HttpURLConnection=null;
字符串结果=”;
//如果url格式不正确,请尝试捕获
试一试{
url=新url(按钮[0]);
httpURLConnection=(httpURLConnection)url.openConnection();
InputStream in=httpURLConnection.getInputStream();
InputStreamReader reader=新的InputStreamReader(in);
int data=reader.read();
while(数据!=-1)
{
当前字符=(字符)数据;
结果+=电流;
data=reader.read();
}
返回结果;
}捕获(例外e){
e、 printStackTrace();
返回“失败”;
}
}
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DownloadTask DownloadTask=新的DownloadTask();
试一试{
字符串内容=下载任务。执行(“https://www.google.com).get();
Log.i(“返回字符串”,content.toString());
}捕获(例外e)
{
e、 printStackTrace();
}
}
}
看起来一切正常,但仍然没有html源代码日志记录,是什么原因导致ui元素出现得比应该的要晚很多?我的意思是,异步任务的全部原因是它们独立于主线程运行,因此ui元素不受任务的影响,对吗?问题是,您正在调用它,它将阻止线程,直到您得到响应为止,因此只需使用
@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
}
}
公共类下载任务扩展了异步任务{
@凌驾
受保护的字符串背景(字符串…按钮){
网址;
HttpURLConnection HttpURLConnection=null;
字符串结果=”;
StringBuffer buf=新的StringBuffer();
//如果url格式不正确,请尝试捕获
试一试{
url=新url(按钮[0]);
httpURLConnection=(httpURLConnection)url.openConnection();
InputStream in=httpURLConnection.getInputStream();
BufferedReader reader=新的BufferedReader(新的InputStreamReader(in));
如果(is!=null){
而((result=reader.readLine())!=null){
追加(结果);
}
}
返回buf.toString();
}捕获(例外e){
e、 printStackTrace();
返回“失败”;
}
}
@凌驾
…onPostExecute(字符串str){
//在此处更新用户界面
}
}
我很高兴能帮上忙,编码快乐!
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
}
}