自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?
Posted
技术标签:
【中文标题】自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?【英文标题】:Progress bar inside custom dialog fragment - How to pass progress from an 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);
【问题讨论】:
【参考方案1】:手动创建活动是个坏主意,这可能是问题的根源。
OrderActivity progressChanged = new OrderActivity();
您可能需要将活动作为参数传递或转换getContext();
我也不知道为什么您需要在那里进行活动。目标侦听器应该是对话框,您应该在活动中设置侦听器,而不是环绕方式。
【讨论】:
我已经删除了接口并创建了两个方法,一个在 onStart() 内部 - 这会启动进度对话框,另一个在 onProgress() 内部的方法 - 这会将值转发到我更新进度的对话框酒吧。希望这是有道理的,并且将来不会有任何问题。以上是关于自定义对话框片段内的进度条 - 如何从 AsyncTask 传递进度?的主要内容,如果未能解决你的问题,请参考以下文章