ProgressDialog在AsyncTask中表现得很奇怪

时间:2013-02-01 07:48:02

标签: android android-asynctask progressdialog

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

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;
}

任何想法?感谢

2 个答案:

答案 0 :(得分:0)

正如Doc所说的AsyncTask.get()

  

如果需要,最多等待计算的给定时间   完成,然后检索其结果。

目前你在主UI线程上调用AsyncTask.get()并且没有出现进度对话框。你需要在不调用get()方法的情况下启动AsyncTask:

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方法,那么使用Thread来获取结果并避免冻结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();

答案 1 :(得分:0)

我借助ρяσѕρєяK想出来,谢谢

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

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

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