在我的活动中,我从数据库加载列表的内容,并希望在加载时显示ProgressDialog。
我已经完成了它自己的工作,但是如果我在一个线程中加载数据(我应该这样做?),列表会在加载数据之前显示。但如果我使用join,则ProgressDialog甚至不会出现。
我该如何结合这个?或者这对线程来说根本不可能? (也许AsyncTask?)
以下是参考代码:
final ProgressDialog progressD=ProgressDialog.show(ShopSwitchActivity.this, "", "Loading..", true);
Thread myThread = new Thread(new Runnable() {
@Override
public void run() {
try
{
getData();
}catch(Exception e){}
}
});
myThread.start();
try {
myThread.join();
} catch (InterruptedException e) {
}
progressD.dismiss();
编辑:使用AsyncTask更新代码:
public class LoadList extends AsyncTask<String, Void, Boolean> {
ProgressDialog dialog;
ShopSwitchActivity activity;
public LoadList(ShopSwitchActivity activity) {
this.activity = activity;
dialog = new ProgressDialog(activity);
}
protected void onPreExecute() {
this.dialog.setMessage("Loading...");
this.dialog.show();
}
@Override
protected void onPostExecute(final Boolean success) {
if (dialog.isShowing()) {
dialog.dismiss();
}
}
protected Boolean doInBackground(final String... args) {
try{
activity.getData();
} catch (Exception e) {
Log.e("error", e.getMessage());
}
return true;
}
}
编辑:我的解决方案 现在使用AsyncTask加载数据,完成后,我用新数据刷新列表。
答案 0 :(得分:4)
您可以使用AsyncTask执行此操作。在主类中编写要执行操作的AsyncTask类。您可以在异步类的preexcecute中创建进度对话框,并在异步类的onpostexecute中关闭。以下是您将如何做到这一点:
class MyAsync extends AsyncTask<String, Void, Void> {
ProgressDialog pd;
Context co;
MyActivity ma;
public MyAsync (MyActivity ma){
this.ma= ma;
this.co = ma;
pd= new ProgressDialog(co);
}
@Override
protected void onPreExecute() {
this.pd.show();
super.onPreExecute();
}
@Override
protected Void doInBackground(String... params) {
// do your database operations here
return null;
}
@Override
protected void onPostExecute(Void result) {
// show db results and dismiss progress dialog pd.dismiss();
super.onPostExecute(result);
}
}
在MyActivity中调用:
MyActivity ma = this;
new MyAsync(ma).execute();
答案 1 :(得分:1)
你好像错过了一个主题。线程与应用程序同时发生。所以你的应用程序不会调用start然后等待线程结束 - 如果它确实你只能使用一个函数。而是您的代码继续运行。因此,如果您只是立即致电加入,那么您就没有做任何事情。你会以这种方式解决NetworkOnMainThreadException问题,但你仍然会阻止UI线程使你的应用程序完全没有响应(因此没有显示对话框),当看门狗计时器杀死你时你最终会崩溃
相反,处理此问题的最佳方法是使用AsyncTask。在doInBackground()中调用getData。然后在onPostExecute中关闭对话框。
答案 2 :(得分:1)
您应该实际使用AsyncTask
。
Here是图书馆的链接。这很简单:
1)onPreExecute()
=显示ProgressDialog
2)doInBackground()
=执行你的代码
3)onPostExecute()
=解雇ProgressDialog
Here也是一个不错的教程。
一般来说:
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(this.context);
dialog.setMessage("Loading...");
dialog.setCanceledOnTouchOutside(false);
}
@Override
protected void onPostExecute(String result) {
if(dialog.isShowing()) {
dialog.dismiss();
}
}
答案 3 :(得分:1)
private Thread myThread;
private ProgressDialog mProgDialog;
mProgDialog = ProgressDialog.show(ShopSwitchActivity.this,"","Laden..", true);
myThread= new Thread(new Runnable()
{
public void run()
{
myThread.setPriority(Thread.MIN_PRIORITY);
try
{
getData();
}catch(Exception e){}
runOnUiThread(new Runnable()
{
public void run()
{
if (mProgDialog != null&& mProgDialog.isShowing())
mProgDialog.dismiss();
} }
});
}
});
myThread.start();