Android “进度”对话框仅在作业已完成时显示

Android “进度”对话框仅在作业已完成时显示,android,progressdialog,Android,Progressdialog,我有一个我不明白的问题。我想在Android中显示一个简单的进度对话框。因此,我创建了一个AsyncTask,并在构造函数中创建了对话框。我使用onpreexcition方法初始化对话框,使用onPostExecute方法销毁对话框。所以到目前为止,这对我来说是完全正确的。但是当我在Nexus7上启动应用程序时,对话框直到工作完成才显示出来。所以它会在作业结束时出现半秒钟。。。我做错了什么 谢谢你的帮助;) 正如我在你的帖子上评论的那样,数据没有任何价值 我已经编写了一段代码,可以从在线数据库获

我有一个我不明白的问题。我想在Android中显示一个简单的进度对话框。因此,我创建了一个
AsyncTask
,并在构造函数中创建了对话框。我使用
onpreexcition
方法初始化对话框,使用
onPostExecute
方法销毁对话框。所以到目前为止,这对我来说是完全正确的。但是当我在Nexus7上启动应用程序时,对话框直到工作完成才显示出来。所以它会在作业结束时出现半秒钟。。。我做错了什么

谢谢你的帮助;)


正如我在你的帖子上评论的那样,
数据
没有任何价值

我已经编写了一段代码,可以从在线数据库获取数据,并在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);
                }
            });
        }
    }
类LoadMyData扩展异步任务{
//在启动后台线程显示进度对话框之前
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=newprogressdialog(getParent());
pDialog.setMessage(“正在加载,请稍候…”);
pDialog.setUndeterminate(假);
pDialog.setCancelable(假);
pDialog.show();
}
受保护的字符串doInBackground(字符串…args){
//你的代码在这里
返回null;
}
/**
*完成后台任务后,关闭“进度”对话框
* **/
受保护的void onPostExecute(字符串文件\u url){
//获取数据后关闭对话框
pDialog.disclose();
//从后台线程更新UI
runOnUiThread(新的Runnable(){
公开募捐{
//在我的例子中,使用我的适配器在listview中显示数据
适配器=新的MyAdaper();
list.setAdapter(适配器);
}
});
}
}

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

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

如果您这样调用此代码:

String data = new ParseHTMLCodeNew(CommentActivity.this).execute(url).get();
然后你就看不到你的对话了,因为有一个阻塞的用户界面。 方法get()在必要时等待计算完成,然后检索其结果

请致电:

new ParseHTMLCodeNew(CommentActivity.this).execute(url);
工作的结果直接在AsyncTask中处理

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

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);
    }
}
请小心,当您旋转手机时,此代码可能会产生错误。 当活动已销毁但任务已执行时: -“进度”对话框将关闭,不再打开 -对话框或上下文的局部变量不正确


如果操作执行很长时间,则可以通过服务的访问完成吗?

作业完成需要多长时间?告诉我们您如何调用此代码,它似乎是OK的。我这样调用代码:data=new ParseHTMLCodeNew(CommentActivity.this)。execute(url.get();而这项工作只需要几秒钟。。有时5-10,有时更少。我不认为这个解决方案对我有用。我必须以任何方式使用asyncTask,因为网络访问…是的,确实使用asynctasks,但是在预执行和后执行方法中,对对话框的任何访问都应该在ui线程上运行,以解决进度对话框的问题。非常感谢。但是我没有从onComplete方法得到任何结果。。。数据总是空的。。。我的猜测是,它不会跳转到onpostExecutive方法。至少我看不到,当我调试时,我将其添加到主邮件中,你确定块“try/catch”被执行了吗?这个存档有一个完整的示例,一切正常啊,我是个傻瓜。。。我在asyncTask处于活动状态时使用了变量数据,因此数据始终为空。。我的错误。但是非常感谢你!你帮了我很多!这将是很好的,如果一些管理秩序比我更知名的用户可以投票给你的帖子,并标记为正确的!非常感谢。
String data = new ParseHTMLCodeNew(CommentActivity.this).execute(url).get();
new ParseHTMLCodeNew(CommentActivity.this).execute(url);
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");