应用程序下载网页不起作用



我正在学习 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中的 UI

您还可以使用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
}
}

最新更新