【问题标题】:Progress bar inside custom dialog fragment - How to pass progress from an AsyncTask?自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?
【发布时间】:2015-06-26 02:29:41
【问题描述】:

我创建了一个自定义对话框片段,在其中我放置了一个进度条。主机活动有一个 AsyncTask 将一些图像上传到服务器。我需要一种将进度传递给进度对话框片段的方法,我尝试过通过变量,但随着进度的变化,它会一次又一次地启动片段。

当值发生变化时,如何在不重新启动对话框片段的情况下传递进度值?

我也尝试过使用接口,但它不会初始化我的侦听器(侦听器始终为空)。

更新: 我通过在我的 asyncTask 的 onStart() 方法中启动对话框片段解决了我的问题。比我在 onProgeress() 方法中创建了另一个方法,它将进度值转发到已经打开的警报对话框:

            @Override
            public void onProgress(int position, int length) {
                ((PreloaderDialog) newFragment).passValues(position,
                        length);
            }

            @Override
            public void onStart() {
                // Show preloader dialog
                newFragment.show(getSupportFragmentManager(),
                        "preloader");
            }

在我的 AlertDialog 片段中:

public void passValues(int position, int length){
        uploadProgress.setMax(length);
        uploadProgress.setProgress(position);
    }

旧代码:

我的异步任务(loopj):

私有UploadProgressListenerprogressListener;

    public interface UploadProgressListener { 
        public void onProgress(int position, int length);       
    }

    //Interface to send selected image's position for deletion
    public void setUploadProgressListener(UploadProgressListener listener) {  
        this.progressListener = listener;  
    } 

....

    client.post("http://www.edmondvarga.com/laborator/upload.php", params,
                    new AsyncHttpResponseHandler() {

                        @Override
                        public void onFailure(int arg0, Header[] arg1, byte[] arg2,
                                Throwable arg3) {
                            System.out.println("Upload failed!" + arg3
                                    + " statys code: " + arg0);
                            if (arg0 == 0) {
                                System.out.println("Retrying Upload!");
                                sendZip();
                            }
                        }

                        @Override
                        public void onProgress(int position, int length) {

                            if(progressListener != null){
                            progressListener.onProgress(position, length);
                            }

                        }

                        @Override
                        public void onStart() {

                            // Show preloader dialog
                            DialogFragment newFragment = new PreloaderDialog();
                            newFragment.show(getSupportFragmentManager(),
                                    "preloader");
                        }

                        @Override
                        public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
                            System.out.println("Success!");
                            Toast.makeText(context, "Multumim pentru Comanda!",
                                    Toast.LENGTH_LONG).show();
                            finish();
                            datasource.deleteAllRows();
                        }
                    });

以及进度对话框片段:

public class PreloaderDialog extends DialogFragment implements UploadProgressListener {

    private Builder v;
    private ProgressBar uploadProgress;
    int position;
    int length;

    /*
    public PreloaderDialog() {
        this.position = position;
        this.length = length;
    }
    */

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.preloader_dialog, null);

        builder.setView(view);

        OrderActivity progressChanged = new OrderActivity();
        progressChanged.setUploadProgressListener(new UploadProgressListener() {

            @Override
            public void onProgress(int position, int length) {
                System.out.println("changed");

            }
        });

        uploadProgress = (ProgressBar) view.findViewById(R.id.uploadProressbar);

        // Create the AlertDialog object and return it
        return builder.create();
    }


    @Override
    public void onProgress(int position, int length) {
        //uploadProgress.setMax(length);
       // uploadProgress.setProgress(position);
        //System.out.println("progresspos: " + position);

    }

【问题讨论】:

    标签: android android-fragments android-asynctask callback progress-bar


    【解决方案1】:

    手动创建活动是个坏主意,这可能是问题的根源。

    OrderActivity progressChanged = new OrderActivity();
    

    您可能需要将活动作为参数传递或转换getContext(); 我也不知道为什么您需要在那里进行活动。目标侦听器应该是对话框,您应该在活动中设置侦听器,而不是环绕方式。

    【讨论】:

    • 我已经删除了接口并创建了两个方法,一个在 onStart() 内部 - 这会启动进度对话框,另一个在 onProgress() 内部的方法 - 这会将值转发到我更新进度的对话框酒吧。希望这是有道理的,并且将来不会有任何问题。
    猜你喜欢
    • 2017-07-18
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多