gpt4 book ai didi

Android AsyncTask onPostExecute 方法

转载 作者:太空宇宙 更新时间:2023-11-03 10:29:52 26 4
gpt4 key购买 nike

编辑: 如果我根本不使用进度,只显示对话框,那么一切正常,没有任何问题。但是,如果我添加进度,则对话框不会关闭(不会触发方法 onPostExecute())。


onPostExecute 方法没有被执行。我哪里有错误? (模拟器和设备上的结果相同)我也不确定是否应该对这些方法使用覆盖符号

这是目前的粗略解决方案。它每次都有效,但不是正确的,也不是很好的。我在做什么:* 我使用 tabgroupactivity 开始一个子 Activity * 然后我导航到子 Activity 中的另一个 Activity ,所以它是 parent 的当前 child * 有一个 WebView ,我在其中显示有关一条评论的信息..随便* webView显示的内容中有链接* 当我点击它时,我开始下载 PDF 文件。

下载文件时:

    while ((current = bis.read()) != -1) {
read = read + current;
baf.append((byte) current);
Dialog.setProgress(read);

if(Dialog.isShowing() && read+2*current>file_size){
Dialog.dismiss();
Dialog.cancel();
}
}

我的 Dialog 对象消失了,所以如果我尝试在 While 循环之后调用 Dialog,我就是不明白。所以我所做的是,每次我从网站获得新缓冲区时,我检查对话框是否仍然可见,以及当前字节和到目前为止读取的字节数是否大于文件的完整大小,然后我在 while 循环中关闭对话框。我尝试使用 fileSize == read(amount of bytes),但它没有用,也许在下载文件时它们没有精确匹配

private class DownloadPDFFile extends AsyncTask<String, Integer, Void> {
private ProgressDialog Dialog = new ProgressDialog(getParent());

protected void onPreExecute() {
Dialog.setMessage("Downloading PDF file..");
Dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
Dialog.setCancelable(false);
// Dialog.setMax(1000);
Dialog.setProgress(0);
Dialog.show();
}

protected Void doInBackground(String... urls) {
File file=null;
int file_size = 0;
try {
URL url = new URL(urls[0]);
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
file_size = urlConnection.getContentLength();
Dialog.setMax(file_size);
} catch (IOException e) {

}

try {
URL url1 = new URL(urls[0]); // you can // link

file = new File("skm_intern_pdf.pdf");

URLConnection ucon = url1.openConnection();

InputStream is = ucon.getInputStream();

BufferedInputStream bis = new BufferedInputStream(is);

ByteArrayBuffer baf = new ByteArrayBuffer(5000);
int read = 0;
int current = 0;
while ((current = bis.read()) != -1) {
read = read + current;
baf.append((byte) current);
Dialog.setProgress(read);

if(Dialog.isShowing() && read+2*current>file_size){
Dialog.dismiss();
Dialog.cancel();
}
}

FileOutputStream fos = openFileOutput("skm_pdf.pdf",
Context.MODE_WORLD_WRITEABLE);
fos.write(baf.toByteArray());
fos.flush();
fos.close();

} catch (IOException e) {

}

return null;
}

最佳答案

AsyncTask 的父级是否在 AsyncTask 完成之前被取消/暂停/销毁?

如果是,AsyncTask 可能会收到一个 cancel(),这会导致 onPostExecute() 永远不会运行。要验证这一点,请尝试覆盖 onCancelled() 方法并检查它是否运行。

关于Android AsyncTask onPostExecute 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7594266/

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