我正在构建一个Android应用程序,我需要下载一个pdf,然后查看它。我有下载和查看代码正常工作。我决定使用Asynctask下载并显示进度。但是,当它启动时,系统似乎已冻结,并且在文件下载之后才会出现对话框。这是我的onClick代码:
public void onClick(View v) {
DownloadFile downloadFile = new DownloadFile();
downloadFile.execute(
"http://store.aqa.org.uk/qual/newgcse/pdf/AQA-4130-W-SP.PDF",
"userguide.pdf");
try {
downloadFile.get();
viewPDF(getExternalFilesDir(null) + "/userguide.pdf");
} catch (Exception e) {
}
}
知道如何解决这个问题。
我认为我可以将viewPdf放在onPostExecute方法中,但是这个方法专门用于下载文件,这是一个特殊情况,必须用它来查看pdf。
提前致谢
编辑:我解决了我的问题。
我添加了一个参数,我可以在其中指定请求。这包含在结果中并依赖于它,它可能会显示或不显示。感谢所有帮助
答案 0 :(得分:1)
正如医生所说
AsyncTask.html.get():
如果需要,最多等待计算的给定时间 完成,然后检索其结果。
表示如果你调用get方法从AsyncTask获取结果,这将在UI线程中等待,直到从AsyncTask doInBackground方法控制回来。
您可以通过将当前活动上下文传递给DownloadFile以将方法从Activity调用到onPostExecute方法来解决当前问题:
private class DownloadFile extends AsyncTask<String, Void, String> {
Context context;
public DownloadFile(Context context){
this.context=context;
}
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(String... params) {
// put your PDf downloading related code here
return null;
}
@Override
protected void onPostExecute(String result) {
// Access Activity method here using context;
context.viewPDF(getExternalFilesDir(null) + "/userguide.pdf");
}
}
并在按钮上执行DownloadFile
,点击活动:
public void onClick(View v) {
DownloadFile downloadFile = new DownloadFile(Current_Activity.this);
downloadFile.execute(
"http://store.aqa.org.uk/qual/newgcse/pdf/AQA-4130-W-SP.PDF",
"userguide.pdf");
}
答案 1 :(得分:0)
快速做到这一点:
public void onClick(View v) {
DownloadFile downloadFile = new DownloadFile() {
@Override
public void onPostExecute(Void result) {
super.onPostExecute(result);
viewPDF(getExternalFilesDir(null) + "/userguide.pdf");
}
};
downloadFile.execute(
"http://store.aqa.org.uk/qual/newgcse/pdf/AQA-4130-W-SP.PDF",
"userguide.pdf");
}
这称为匿名类。它仅对此实例重写了DownloadFile中的onPostExecute。