进度对话框没有出现

时间:2012-07-16 08:38:18

标签: android android-layout android-activity progressdialog

ListView中有Activity1OnItemClick,我正在导航到另一个活动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) {
    }
};

感谢任何帮助。

7 个答案:

答案 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在线程完成后从线程发送消息并隐藏对话框。