gpt4 book ai didi

java - AsyncTask 直到最后才完成下载

转载 作者:行者123 更新时间:2023-12-01 19:03:00 25 4
gpt4 key购买 nike

所以我正在构建一个应用程序,它从网站获取一些 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com