ProgressDialog在Android应用程序中不会消失

时间:2012-03-18 10:20:22

标签: android

我有一个Android应用程序,在其主要活动中,数据从sqlite db改编并显示在列表视图中。我尝试使用“进度”对话框在从数据库获取数据期间向用户显示“正在加载”消息。但对话框并没有消失。

以下是代码:

public class BirthdayAlarmActivity extends ListActivity {

    List<BirthdayContact> listofAvailableBirthdays;

    ProgressDialog pDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.birthday_list);


        listofAvailableBirthdays=new ArrayList<BirthdayContact>();

        ReinitializeList();
}

@Override
protected void onResume() {

        ReinitializeList();
}


void ReinitializeList()
    {

        new LoadListView().execute();

            if(listofAvailableBirthdays.size()>0)
        {
            //get ready the adapter
            ArrayAdapter<BirthdayContact> ara=
                     new                 MyArrayAdapter(BirthdayAlarmActivity.this,listofAvailableBirthdays);

            //set the adapter
            setListAdapter(ara);
             }

}

public class LoadListView extends AsyncTask<Void, Void, Void>
{

        //ProgressDialog pDialog;

        @Override
        protected void onPreExecute() {
            // Showing progress dialog before sending http request
            pDialog = new ProgressDialog(
                    BirthdayAlarmActivity.this);
            pDialog.setMessage("Please wait..");
            pDialog.setIndeterminate(true);
            pDialog.setCancelable(false);
            pDialog.show();
        }

        protected Void doInBackground(Void... unused) {
            runOnUiThread(new Runnable() {
                public void run() {
                    // increment current page
                    listofAvailableBirthdays.clear();

                    listofAvailableBirthdays=BirthdayHandler.GetTenBirthDays(BirthdayAlarmActivity.this);
                }
            });
            return (null);
        }       

        protected void onPostExecute(Void unused) {
            // closing progress dialog
            pDialog.dismiss();
        }

    }

2 个答案:

答案 0 :(得分:2)

我不熟悉你正在使用的技术,但我将分享对我有用的技术:

final ProgressDialog progress = ProgressDialog.show(activity, "",
    activity.getString(R.string.please_wait), true);

new Thread(new Runnable() {
  @Override
  public void run()
  {
    try {
      --- network activity to retrieve information ---
    }
    finally {
      activity.runOnUiThread(new Runnable() {
        @Override
        public void run()
        {
          if ((progress != null) && progress.isShowing())
            progress.dismiss();
        }
      });
    }
  }
}).start();

答案 1 :(得分:1)

我认为这里的问题是你指的是你的pDialog,并试图在与你声明的类不同的类中创建它。

您应该尝试使用showDialogdismissDialogonCreateDialog方法添加一个抽象层,并在正确的类/线程中调用对话框。您也可以使用Handler作为替代方案。

尝试这样的事情:

public class BirthdayAlarmActivity extends ListActivity {

List<BirthdayContact> listofAvailableBirthdays;

ProgressDialog pDialog;
static final int LOADING_DIALOG = 1;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.birthday_list);


    listofAvailableBirthdays=new ArrayList<BirthdayContact>();

    ReinitializeList();
}

@Override
protected void onResume() {

    ReinitializeList();
 }


void ReinitializeList()
{

    new LoadListView().execute();

        if(listofAvailableBirthdays.size()>0)
    {
        //get ready the adapter
        ArrayAdapter<BirthdayContact> ara= 
new MyArrayAdapter(BirthdayAlarmActivity.this,listofAvailableBirthdays);

        //set the adapter
        setListAdapter(ara);
         }

 }

@Override
 protected Dialog onCreateDialog(int id)
 {
  switch(id)
   {
     case LOADING_DIALOG:
    // Showing progress dialog before sending http request
        pDialog = new ProgressDialog(
                BirthdayAlarmActivity.this);
        pDialog.setMessage("Please wait..");
        pDialog.setIndeterminate(true);
        pDialog.setCancelable(false);
        return pDialog;

  }
}


public class LoadListView extends AsyncTask<Void, Void, Void>
{


    @Override
    protected void onPreExecute() {
       showDialog(LOADING_DIALOG);
    }

    protected Void doInBackground(Void... unused) {
        runOnUiThread(new Runnable() {
            public void run() {
                // increment current page
                listofAvailableBirthdays.clear();

                listofAvailableBirthdays=BirthdayHandler.GetTenBirthDays(BirthdayAlarmActivity.this);
            }
        });
        return (null);
    }       

    protected void onPostExecute(Void unused) {
        dismissDialog(LOADING_DIALOG);
    }

}

如果失败,你应该通过Handler类使用消息来查看int。