进度对话框仅在作业完成时显示

时间:2012-12-08 16:18:02

标签: android progressdialog

我有一个我不明白的问题。我想在Android中显示一个简单的进度对话框。所以我创建了一个AsyncTask并在构造函数中创建对话框。我使用方法onPreExceutioninitialise对话框和onPostExecute方法来解决对话框。所以直到现在这看起来对我来说都是正确的。但是当我在Nexus 7上启动应用程序时,对话框在作业完成之前不会显示。所以它在工作结束时出现了半秒钟......我做错了什么?

感谢您的帮助;)

public class ParseHTMLCodeNew extends AsyncTask<String, Void, String> {
    ProgressDialog dialog;

    public ParseHTMLCodeNew(Context context) {
        dialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {
        //einrichten des Wartedialogs
        dialog.setTitle("Bitte warten!");
        dialog.setMessage("Die Kommentare werden vom Server geladen.");
        dialog.show();
    }

    @Override
    protected String doInBackground(String params) {
        InputStream is = null;
        String data = "";
        try
        {
            URL url = new URL( params[0] ); 
            is = url.openStream(); 
            data = new Scanner(is).useDelimiter("//html//").next(); 
        } 
        catch ( Exception e ) { 
            e.printStackTrace(); 
        } 
        return data;
    }

    @Override
    protected void onPostExecute(String result) {       
        //Dialog beenden RSS Feed ist fertig  geparst
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
        }        
    }
}

更新

这是我的新AsyncTask:

public class ParseHTMLCodeNew extends AsyncTask<String, String, String> {
ProgressDialog dialog;
private final OnCompleteTaskListener onCompleteTaskListener;

public interface OnCompleteTaskListener {
        void onComplete(String data);
}

public ParseHTMLCodeNew(Context context, OnCompleteTaskListener taskListener) {
    onCompleteTaskListener = taskListener;
    dialog = new ProgressDialog(context);
}


@Override
protected void onPreExecute() {

    //einrichten des Wartedialogs
    dialog.setTitle("Bitte warten!");
    dialog.setMessage("Die Kommentare werden vom Server geladen.");
    dialog.show();

}

@Override
protected String doInBackground(String... params) {
    InputStream is = null; 
    String data = "";
    try 
    { 
      URL url = new URL( params[0] ); 
      is = url.openStream(); 
      data = new Scanner(is).useDelimiter("//html//").next(); 
    } 
    catch ( Exception e ) { 
      e.printStackTrace(); 
    } 
    return data;
}

@Override
protected void onPostExecute(String result){

  onCompleteTaskListener.onComplete(result);

  //Dialog beenden RSS Feed ist fertig  geparst
  if (dialog != null && dialog.isShowing()) {
      dialog.dismiss();
  }




}
}

我这样称呼它:

new ParseHTMLCodeNew(this,new OnCompleteTaskListener() {

        @Override
        public void onComplete(String data) {
            gData = data;

        }
    }).execute(url);

正如我对您的帖子发表评论,data没有任何价值。

3 个答案:

答案 0 :(得分:0)

我写了一个从在线数据库中获取数据并在lisview中填充数据的代码,这是我的代码希望有用的部分!

class LoadMyData extends AsyncTask<String, String, String> {
        //Before starting background thread Show Progress Dialog

        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getParent());
            pDialog.setMessage("Loading. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }


        protected String doInBackground(String... args) {

                    //Your code here 

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting the data
            pDialog.dismiss();
            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {
                    // In my case use my adapter to display the data in a listview 


                    adapter = new MyAdaper();
                    list.setAdapter(adapter);
                }
            });
        }
    }

答案 1 :(得分:0)

进度对话框应显示在UI线程

 runOnUiThread(new Runnable() {
            public void run() {
dialog.setTitle("Bitte warten!");
dialog.setMessage("Die Kommentare werden vom Server geladen.");
dialog.show();
}});

答案 2 :(得分:0)

如果您这样调用此代码:

String data = new ParseHTMLCodeNew(CommentActivity.this).execute(url).get();

然后你没有真正看到你的对话,因为有一个阻止的用户界面。 方法get()在必要时等待计算完成,然后检索其结果。

这样打电话:

new ParseHTMLCodeNew(CommentActivity.this).execute(url);

,工作结果直接在AsyncTask中处理。

如果您需要将数据传输到主线程,您应该告诉他任务已完成。 Wat是简单的代码,我刚刚添加了 OnCompleteTaskListener接口

public class ParseHTMLCodeNew extends AsyncTask<String, Void, String> {

    private final OnCompleteTaskListener onCompleteTaskListener;
    private ProgressDialog dialog;

    public interface OnCompleteTaskListener {
        void onComplete(String data);
    }

    public ParseHTMLCodeNew(Context context, OnCompleteTaskListener taskListener) {
        onCompleteTaskListener = taskListener;
        dialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {

        // einrichten des Wartedialogs
        dialog.setTitle("Bitte warten!");
        dialog.setMessage("Die Kommentare werden vom Server geladen.");
        dialog.show();

    }

    @Override
    protected String doInBackground(String... params) {
        StringBuilder sb = new StringBuilder();

        // your code here
        try {
            for (int i = 0; i < 100; i++) {
                Thread.sleep(100);
                sb.append(i);
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return sb.toString();
    }

    @Override
    protected void onPostExecute(String result) {

        // Dialog beenden RSS Feed ist fertig geparst
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
        }

        onCompleteTaskListener.onComplete(result);
    }
}

和电话的例子

new ParseHTMLCodeNew(this,new OnCompleteTaskListener() {

            @Override
            public void onComplete(String data) {
                Toast.makeText(CommentActivity.this, data, Toast.LENGTH_LONG).show();

            }
        }).execute("your_url");

请注意,旋转手机时此代码可能会产生错误。 当Activity被销毁但执行任务时: - 进度对话框将关闭,不会再次打开 - 对话框或上下文的局部变量不正确。

如果长时间执行操作可以通过服务吗?