所以我正在构建一个应用程序,它从网站获取一些 HTML 代码并返回一些数据,但问题是我使用 onCreate 的 AsyncTask 不会下载整个 HTML 代码,而只是下载其中的一部分,就像它在某个时刻崩溃了,我搜索了很多并尝试了很多解决方案,但似乎都不起作用。
我遇到的唯一“错误”是主线程上有太多工作,但我如何理解 AsyncTask 应该在另一个线程的后台完成。
这是 AsyncTask 类:
public class SiteInfo extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
URL url;
String result;
InputStream inputStream;
BufferedReader bufferedReader;
try {
url = new URL(urls[0]);
bufferedReader = new BufferedReader(new InputStreamReader(inputStream = url.openStream()));
String inputLine;
final StringBuffer buffer = new StringBuffer();
while ((inputLine = bufferedReader.readLine()) != null) {
buffer.append(inputLine);
}
bufferedReader.close();
result = buffer.toString();
Log.i("download", result);
inputStream.close();
return result;
}
catch (MalformedURLException e)
{
e.printStackTrace();
return "";
}
catch (IOException e)
{
e.printStackTrace();
return "";
}
catch (Exception e)
{
e.printStackTrace();
return "";
}
}
}
以下是清除信息的 HTML 代码的方法:
public void getInfo()
{
final SiteInfo task= new SiteInfo();
String result;
try
{
result= task.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR,"*random site url*").get();
String[] temp;
Pattern urlName= Pattern.compile("<div class=\"image\"><img src=\"\"(,*?)\"/");
Matcher matcher=urlName.matcher(result);
for(int i=0; matcher.find(); i++)
{
temp=matcher.group(1).split("\" alt=\"");
imageURL.set(i,temp[i]);
name.set(i,temp[i+1]);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
最后在onCreate中调用该方法:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=findViewById(R.id.imageView);
startButton=findViewById(R.id.startButton);
getInfo();
}
最佳答案
不要使用AsyncTask.get()
,而是应该使用new SiteInfo().excute("*random site url*")
来启动AsyncTask然后在 SiteInfo
中覆盖 onPostExecute()
来获取结果。
您可能想要创建另一个界面来将结果返回到您的 Activity 中。
如果您对如何操作有任何疑问,请告诉我
我现在检查了这个,它在我的手机上运行,不要使用日志查看html响应日志无法查看长消息,相反,你可以这个Logger
这是我的代码
public class MainActivity extends AppCompatActivity implements DataInterface
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new SiteInfo(this).execute("https://code.visualstudio.com/");
Logger.addLogAdapter(new AndroidLogAdapter());
}
@Override
public void returnData(String result) {
Logger.e(result);
}
public class SiteInfo extends AsyncTask<String, Void, String> {
DataInterface dataInterface;
SiteInfo(DataInterface dataInterface) {
super();
this.dataInterface = dataInterface;
}
@Override
protected String doInBackground(String... urls) {
URL url;
String result;
InputStream inputStream;
BufferedReader bufferedReader;
try {
url = new URL(urls[0]);
bufferedReader = new BufferedReader(new InputStreamReader(inputStream = url.openStream()));
String inputLine;
final StringBuilder buffer = new StringBuilder();
while ((inputLine = bufferedReader.readLine()) != null) {
buffer.append(inputLine);
}
bufferedReader.close();
result = buffer.toString();
Log.i("download", result);
inputStream.close();
return result;
} catch (MalformedURLException e) {
e.printStackTrace();
return "";
} catch (IOException e) {
e.printStackTrace();
return "";
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
@Override
protected void onPostExecute(String result) {
dataInterface.returnData(result);
}
}
}
界面是
public interface DataInterface {
void returnData(String result);
}
关于java - AsyncTask 直到最后才完成下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59605209/