Asynctask .get()奇怪的行为

时间:2013-01-28 16:41:23

标签: android android-asynctask

我正在构建一个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。

提前致谢

编辑:我解决了我的问题。

我添加了一个参数,我可以在其中指定请求。这包含在结果中并依赖于它,它可能会显示或不显示。感谢所有帮助

2 个答案:

答案 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。