AsyncTask 直到最后才完成下载

AsyncTask doesn't finish the download till the end

所以我正在构建一个应用程序,它从站点获取一些 HTML 代码并返回一些数据,但问题是我正在使用 onCreate 的 AsyncTask 不会下载整个 HTML 代码只是它的一部分,就像它在某个时候崩溃一样我搜索了很多并尝试了很多解决方案,但 none 似乎有效。

我得到的唯一 "errors" 是主线程上的工作太多,但我如何理解 AsyncTask 应该在另一个线程的后台完成。

这是 AsyncTask class:

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();

}

不要在异步任务上使用 get() 方法。

它会在下载过程中冻结您的应用程序。

而是在 onPostExecute() 中处理 doInBackground 的结果。

不要使用 AsyncTask.get() 而应该使用 new SiteInfo().excute("*random site url*") 启动 AsyncTask,然后在 SiteInfo 中覆盖 onPostExecute() 以获得结果。

您可能想要制作另一个界面以将结果返回到您的 activity。

如果您对如何操作有任何疑问,请告诉我

我现在检查了这个,它正在我的 phone 上工作,不要使用日志查看 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);
}