未显示从DialogFragment调用的AsyncTask中的ProgressDialog

时间:2014-08-18 21:55:24

标签: android android-asynctask progress-bar progressdialog

我正在从DialogFragment内部执行AsyncTask,但在doInBackground期间不显示进度条。这是代码:

public class GetCustomerSoapAsync extends AsyncTask<Void, Void, String>
{
  ProgressDialog prg;
  ActionBarActivity activity;
  GetResponseFromGetCustomer listener;


  public GetCustomerSoapAsync(ActionBarActivity activity, GetResponseFromGetCustomer listener)
  {
    this.activity = activity;
    this.listener = listener;
    prg = new ProgressDialog(activity);
    prg.setMessage("Lütfen Bekleyin");
    Log.i("ED","Progress will be shown");
    prg.show();

  }



  @Override protected String doInBackground(Void... params)
  {
    //some stuff
  }

  @Override protected void onPostExecute(String s)
  {
    listener.getResponseFromGetCustomer(s);

    if (prg.isShowing())
    {
        prg.dismiss();
    }

 }

我称之为:

public class B1_PhoneNumberFragment extends android.support.v4.app.Fragment
{
 ...
  buttonLogin.setOnClickListener(new OnClickListener()
    {

        @Override
        public void onClick(View v)
        {
          ...


          PhoneNumberVerified dialog = new PhoneNumberVerified();
                dialog.show(getFragmentManager(), "NumberVerifiedByUser");

        }
        ...
    }
   ....



  public class PhoneNumberVerified extends DialogFragment
  {

   @Override
   public Dialog onCreateDialog(Bundle savedInstanceState)
   {
     // Use the Builder class for convenient dialog construction
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
     // Format of this dialog will be changed
     builder.setMessage("Numaranız doğru mu?\n" + "0" + number)
                .setPositiveButton(R.string.yes,
                        new DialogInterface.OnClickListener()
                        {
                            public void onClick(DialogInterface dialog,
                                                int id)
                            {
                                GlobalApplication.getUser().setPhone(
                                        (excludeParanthesis
                                                (number)));

                                //AsyncTask is not working properly,
                                // progress dialog is not shown and code flows before
                                // response is set to s
                                GetCustomerSoapAsync getCustomerSoapAsync =
                                        new GetCustomerSoapAsync(
                                                (ActionBarActivity) getActivity(),
                                                new GetResponseFromGetCustomer()

                                                {
                                                    @Override
                                                    public void getResponseFromGetCustomer
                                                            (String s)
                                                    {
                                                        response = s;
                                                    }
                                                });

                                getCustomerSoapAsync.execute();


                                Log.i("ED", "Response after GetCustomerSoapAsync callback: " +
                                            response);

}

最后,也许是因为任务的错误流程或其他东西,回调无法完成其工作,并且响应未设置为返回AsyncTask的值。

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

您应该使用onPreExecute

class Task1 extends AsyncTask<Object, Void, String []> {

    /** The Progress dialog. */
    private final ProgressDialog dialog = new ProgressDialog(YourActivity.this);


    /**
     * Set the Progress dialog.
     */
    protected void onPreExecute() 
    {
    super.onPreExecute();
    this.dialog.setMessage("Loading...");
    this.dialog.show();
    dialog.setCanceledOnTouchOutside(false);
    }


    protected String[] doInBackground(Object... params) {
        ///
    }

    protected void onPostExecute(String [] result) 
    {
        super.onPostExecute(result);
        this.dialog.dismiss();
    }

}

要打电话给你,你应该:

Task1 myTask = new Task1();    
myTask.execute(stopArrey, start, end);

希望它有所帮助! :)

答案 1 :(得分:1)

您只需要在UI线程上操作ProgressDialog。

asynctask上的构造函数提供了足够的灵活性,可以将任务放在它自己的类中。注意:在自定义AsyncTask的构造函数中初始化的任何字段都必须利用java final关键字,因此字段变量会自动为垃圾回收设置为null。

解决方案ProgressDialog代码需要在onPreExecute()中调用,其中任务仍在UI线程上。

public class GetCustomerSoapAsync extends AsyncTask<Void, Void, String>
{
ProgressDialog prg;
// use final for fields initialized in a constructor.
final ActionBarActivity activity;
final GetResponseFromGetCustomer listener;

//以下示例从已经显示的调用者传入ProgressDialog。传入它以访问异步任务发布Progress方法。在侦听器方法中关闭ProgressDialog;你没有展示你的听众,所以这只是一种技巧

 public GetCustomerSoapAsync(ActionBarActivity activity, GetResponseFromGetCustomer     listener, ProgressDialog prg)
{
  this.activity = activity;
  this.listener = listener;
  this.prg = prg;

 // or move this code to onPreExecute() where it runs on the UI thread.
// move this code to onPreExecute() 
//prg = new ProgressDialog(activity);
//prg.setMessage("Lütfen Bekleyin");
//Log.i("ED","Progress will be shown");
//prg.show();

}

答案 2 :(得分:0)

好的问题我相信你必须在Aysnch任务执行之前声明用户可见的布局中的PD。

例如:

//Declare the pd here. Pd private to class.
private ProgressDialog pd;
    builder.setMessage("Numaranız doğru mu?\n" + "0" + number)
                    .setPositiveButton(R.string.yes,
                            new DialogInterface.OnClickListener()
                            {
                              ....
                             pd = ProgressDialog.show(getActivity(), "",
                            "Your Message Here!!!", false);
                            // Now using a modified constructor call your execute function
                           //Previous parametes + pd
                           GetCustomerSoapAsync gCSA = new GetCustomerSoapAsync(...,...,pd);
                           getCustomerSoapAsync.execute();

    }

然后在您的Asynch课程中:

public class GetCustomerSoapAsync extends AsyncTask<Void, Void, String>
{
  ProgressDialog prg;
  ActionBarActivity activity;
  GetResponseFromGetCustomer listener;


      public GetCustomerSoapAsync(ActionBarActivity activity, GetResponseFromGetCustomer listener,ProgressDialog pd)
      ProgressDialog prg;
      {
        this.activity = activity;
        this.listener = listener;
        this.prg = pd;

      }



      @Override protected String doInBackground(Void... params)
      {
        //some stuff
      }

      @Override protected void onPostExecute(String s)
      {
        listener.getResponseFromGetCustomer(s);

        if (prg.isShowing())
        {
            prg.dismiss();
        }

     }

Ps:我不知道你是否使用片段作为实现但如果你是,你必须通过rootview引用你在片段中的onclick函数中调用的相同pd,否则你可能会调用函数从未在第一时间显示的进度对话框。