2012-03-18 46 views
0

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

下面是代码:

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(); 
     } 

    } 
+0

如果您在UI线程上运行doInBackground的所有代码,那么使用AsyncTask有什么意义? – MByD 2012-03-18 10:23:26

+0

我是多线程的概念的新手,并从这个示例中学习它[http://www.androidhive.info/2012/03/android-listview-with-load-more-button/]。我该怎么办 ? – 2012-03-18 10:30:45

回答

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(); 
+0

你的意思是我不需要在活动类体中声明'ProgressDialog'? – 2012-03-18 10:54:02

+0

我不认为你必须这样做,但这取决于你。 – dldnh 2012-03-18 11:02:56

+0

它引发“RunOnUiThread(新的Runnable(){})未定义类型新的Runnable(){}” – 2012-03-18 11:14:55

1

我觉得问题这里是你指的是你的pDialog,并试图用与你声明的类别不同的​​类别创建它。

你应该尝试使用showDialog,dismissDialogonCreateDialog添加一个抽象层的方法,并且在正确的类/线程中调用对话框。您可以使用处理程序以及替代方法。

尝试这样:

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); 
    } 

} 

如果失败,你应该看看INT通过Handler类使用的消息。

+0

谢谢。我测试了你的感觉,而在Hanlder当我想更新列表视图适配器时,它确实抛出错误,并告诉我我不能从另一个线程更新它。 – 2012-03-18 14:10:53

相关问题