ListView
中有Activity1
。 OnItemClick
,我正在导航到另一个活动Activity2
,我有一些数据库代码。
现在问题是从数据库获取数据需要一些时间,因此在从Activity1
导航到Activity2
时,会出现几秒钟的空白屏幕。
为了解决这个问题,我尝试ProgressDialog
,但ProgressDialog
根本没有出现。
活动2中的代码段:
public class Activity2 extends Activity implements Runnable {
@Override
public void onCreate(Bundle savedInstanceState) {
Thread thread = new Thread();
thread.start();
run();
}
@Override
public void run() {
plansDesc = dbMgr.chkRecord(
"SELECT Description FROM SubPlan where Title='" + subTitle
+ "'", "Description");
ProgressDialog progDailog = ProgressDialog.show(
SubPlanDescActivity.this, "Plan Information", "Loading...",
true);
try {
if (plansDesc != "") {
tvDesc.setText(Html.fromHtml(plansDesc));
} else {
tvDesc.setText(Html
.fromHtml("<b>No Information Available...</b>"));
}
} catch (Exception e) {
}
handler.sendEmptyMessage(0);
progDailog.dismiss();
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
}
};
感谢任何帮助。
答案 0 :(得分:4)
尝试AsyncTask而不是线程
请参阅以下代码
@Override
public void onCreate(Bundle savedInstanceState) {
new ProgressTask().execute();
}
现在创建类
private class ProgressTask extends AsyncTask<String, Void, Boolean> {
private ProgressDialog dialog = new ProgressDialog(HomeActivity.this);
protected void onPreExecute() {
this.dialog.setMessage("Please wait");
this.dialog.show();
}
protected Boolean doInBackground(final String... args) {
try {
plansDesc = dbMgr.chkRecord(
"SELECT Description FROM SubPlan where Title='" + subTitle
+ "'", "Description");
return true;
} catch (Exception e) {
Log.e("tag", "error", e);
return false;
}
}
@Override
protected void onPostExecute(final Boolean success) {
if (dialog.isShowing()) {
dialog.dismiss();
}
if (success) {
// display UI
if (plansDesc != "") {
tvDesc.setText(Html.fromHtml(plansDesc));
} else {
tvDesc.setText(Html
.fromHtml("<b>No Information Available...</b>"));
}
}
}
}
答案 1 :(得分:1)
您必须关闭处理程序中的进度对话框。
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
progDailog.dismiss();
}
};
尝试修改这样的代码,
@Override
public void run() {
handler.sendEmptyMessage(1);
plansDesc = dbMgr.chkRecord(
"SELECT Description FROM SubPlan where Title='" + subTitle
+ "'", "Description");
try {
if (plansDesc != "") {
tvDesc.setText(Html.fromHtml(plansDesc));
} else {
tvDesc.setText(Html
.fromHtml("<b>No Information Available...</b>"));
}
} catch (Exception e) {
}
handler.sendEmptyMessage(0);
}
你的处理程序就像这样,
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what==0)
{
progDailog.dismiss();
}
if(msg.what==1)
{
ProgressDialog progDailog = ProgressDialog.show(
SubPlanDescActivity.this, "Plan Information", "Loading...",
true);
}
}
};
答案 2 :(得分:1)
写下这个:
public class Activity2 extends Activity implements Runnable {
Thread thread;
ProgressDialog dialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(yourLayout);
dialog=ProgressDialog.show(this, "","Loading...",true);
dialog.show();
thread = new Thread(this);
thread.start();
}
public void run() {
plansDesc = dbMgr.chkRecord(
"SELECT Description FROM SubPlan where Title='" + subTitle
+ "'", "Description");
try {
if (plansDesc != "") {
tvDesc.setText(Html.fromHtml(plansDesc));
} else {
tvDesc.setText(Html
.fromHtml("<b>No Information Available...</b>"));
}
} catch (Exception e) {
}
handler.sendEmptyMessage(0);
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(dialog!=null && dialog.isShowing()){
dialog.dismiss();
}
}
};
答案 3 :(得分:0)
如果您想要加载数据,请使用AsyncTask这是最佳解决方案。
答案 4 :(得分:0)
在onCreate方法中,必须将“Runnable”元素(此处为“this”)作为线程对象参数。然后,您不需要调用“run”方法,它将使用Thread对象中的start()方法自动调用。
代码示例:
Thread thread = new Thread(this);
thread.start();
我不确定,这完全解决了你的问题,但这是使用带有Runnable接口的线程的好方法。
答案 5 :(得分:0)
new AsyncTask<Void, Void, Cursor>() {
protected void onPreExecute() {
showProgress...
}
protected Cursor doInBackground(Void... structs) {
Loading data...
return result;
}
protected void onPostExecute(Cursor result) {
Hide progress...
}
}.execute();
答案 6 :(得分:0)
在“活动”中显示进度对话框,而不是在数据库线程中。使用Handler在线程完成后从线程发送消息并隐藏对话框。