所以我正在构建一个应用程序,该应用程序从站点获取一些HTML代码并返回一些数据,但问题是我正在使用的AsyncTaskCreate 不会下载整个 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()
以获得结果。
您可能希望创建另一个界面来恢复活动的结果。
如果您对如何操作有任何疑问,请告诉我
我现在检查了这个,它在我的手机上工作,不要使用日志查看 html 响应 日志无法查看长消息,相反,你可以这个记录器
这是我的代码
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);
}
不要在异步任务上使用get()
方法。
它将在下载过程中冻结您的应用程序。
而是在 onPostExecute(( 中处理 doInBackground 的结果。