【问题标题】:ProgressDialog acting strange in AsyncTaskProgressDialog 在 AsyncTask 中表现得很奇怪
【发布时间】:2013-02-01 18:06:27
【问题描述】:

我有以下代码可以从我的网站加载文件

class DownloadTT4FileTask extends AsyncTask<String, String, String> {

                    private Context mContext;
                    private String  mFilename;
                    private ProgressDialog progressDialog;
                    String  retString="";

                    public DownloadTT4FileTask(Context context, String filename) {
                        mContext=context;
                        mFilename=filename;
                    }

                    @Override
                    protected void onPreExecute() {
                        Log.d("DownloadTT4FileTask", "onPreExecute");
                        progressDialog = ProgressDialog.show(mContext, mFilename, "Loading. Please wait...");
                    }

                    protected String doInBackground(String... args) {

                        URL url;
                        try {
                            url = new URL(args[0]);
                            java.net.URLConnection con = url.openConnection();
                            con.connect();
                            //Log.d("DownloadTT4FileTask", "con.connect ok ");

                            java.io.BufferedReader in = new java.io.BufferedReader(new java.io.InputStreamReader(con.getInputStream()));
                            String line;
                            for (; (line = in.readLine()) != null; ) {
                                // just read the line and save it
                                retString += line+"\n";
                            }   

                        } catch (MalformedURLException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        return retString;
                    }

                    protected void onPostExecute(String result) {
                        Log.d("DownloadTT4FileTask", "onPreExecute");
                        progressDialog.dismiss();
                    }
                };
                // loading from website
                filename = "http://2112design.com/tabs/"+band+"/"+song+".tt4";
                String fileContents = new DownloadTT4FileTask(context, filename).execute(filename).get(15L, TimeUnit.SECONDS);

                br = new BufferedReader(new StringReader(fileContents));

加载正常(加载大约 5 秒),但进度对话框有点偏离。它不会在下载开始时出现在屏幕上。任务结束时它会在屏幕上短暂闪烁。

我看过很多如何使用它的例子,看起来这是很正常的代码。

也许上下文是问题?我从一个在不是主要活动的片段中运行的 onChildClick 中得到它。我尝试使用主要活动上下文,但它只是崩溃了。

    @Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
    Globals.mDoc.OpenTT4Document(parent.getContext(), band, song, mRemoteFilesThis==null ? Doc.SDCARD : Doc.WEBSITE);

    return false;
}

有什么想法吗?谢谢

【问题讨论】:

    标签: android android-asynctask progressdialog


    【解决方案1】:

    正如 Doc 所说的 AsyncTask.get()

    如有必要,最多等待给定时间以进行计算 完成,然后检索其结果。

    当前您正在主 UI 线程上调用 AsyncTask.get() 并且没有出现进度对话框。您将需要启动 AsyncTask 而不调用 get() 方法:

    new DownloadTT4FileTask(context, filename).execute(filename);
    

    并在 onPostExecute 内部完成 doInBackground 后更新 UI:

                    protected void onPostExecute(String result) {
                        Log.d("DownloadTT4FileTask", "onPreExecute");
                        progressDialog.dismiss();
                         // get result here
                        br = new BufferedReader(new StringReader(result));
                    }
    

    编辑:

    如果您想调用 AsyncTask 的 get 方法,请使用线程来获取结果并避免 UI 冻结:

    new Thread(new Runnable() {
      public void run() {
         try {
                Your_Activity.this.runOnUiThread(new Runnable() {
                public void run() {
    
                   progressDialog = ProgressDialog.show(Your_Activity.this, 
                     mFilename, "Loading. Please wait...");
                }
               });
                  // start AsyncTask here
                  String fileContents = new DownloadTT4FileTask(context, filename)
                                         .execute(filename).get(15L, TimeUnit.SECONDS);
    
                  Your_Activity.this.runOnUiThread(new Runnable() {
                     public void run() {
                        // update UI elements here
                         br = new BufferedReader(new StringReader(fileContents));
                           progressDialog.dismiss();
                      }
                  });
              } catch (InterruptedException e) {
               // TODO Auto-generated catch block
                e.printStackTrace();
              } catch (ExecutionException e) {
                 // TODO Auto-generated catch block
                   e.printStackTrace();
              } catch (TimeoutException e) {
                        // TODO Auto-generated catch block
                   e.printStackTrace();
              }
           }
     }).start();
    

    【讨论】:

    • 感谢您的快速回答。我宁愿在我的主线程中处理下载的结果。我想知道有没有一种方法可以在没有 get 的情况下执行然后在主线程中等待直到 asynctask 完成,然后获取返回值?
    • @steveh :如果不调用 asynctask 的 get() 方法,就无法取回结果。如果您从 UI 主线程调用 asynctask.get(),请查看我的编辑答案,那么您肯定需要在 Thread 中调用它以避免 UI 冻结,并使用 runOnUiThread 从 Thread 更新 UI,如我的答案中所示已经建议了
    • 谢谢,我刚刚粘贴了你的代码,但它抱怨所有参数都不是最终的,我不能让它们成为最终的,因为有些是函数参数。
    • @steveh : 只需在 Activity 的 onCreate 之前声明所有参数类级别字段
    • 顺便说一句,我不太关心返回结果。我可以将 String fileContents 传递给任务的构造函数,然后将 doInBackgroud 写入它。我尝试使用 Thread.sleep(5000) 运行任务并在调用线程中等待几秒钟,但进度的事情仍然没有出现
    【解决方案2】:

    我在 ρяσѕρєя K 的帮助下弄明白了,谢谢

    基本问题是我没有从启动加载线程的 onChildClick 返回,所以 ProgressDialog.show 在线程完成之前并没有真正做任何事情,到那时就没有意义了,

    所以我现在要做的是在没有 get 的情况下启动 asynctask,并对 onPostExecute 中的读取数据进行所有处理。所以我可以立即从我的加载函数返回,回到 UI 线程并显示进度。

    但问题是,我没有要在主 UI 中显示的新文档,所以我显示并清空一个标题为“等待等等等等等等……”的文档。加载完成后,我的主视图无效并显示文档。

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 2014-12-12
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多