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

标签 java android android-asynctask

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

相关文章:

java - 如何将 JLabel 和 JTextField 添加到 BorderLayout 中心的底部?

java - Android TaskManager 将显示当前内存使用情况和 CPU 使用情况

android - 有没有办法在 Android 上以编程方式设置默认主页/启动器?

android - 如何在用户通过按下 Android 中的后退键关闭警报对话框时捕获事件

java - 无法使文本等于字符串

java - Web 应用程序审计跟踪

java - 使用 SnakeYAML 的嵌套结构

java - AsyncTask 工作时不显示进度条

android - 在 Plugin.execute() 中实例化 AsyncTask 时出现 ExceptionInInitializerError

android - 如何使用服务中的异步任务写入内部存储中的文件?