【问题标题】:Progress Dialog not appearing进度对话框未出现
【发布时间】:2012-07-16 08:38:18
【问题描述】:

我在Activity1 中有一个ListViewOnItemClick,我正在导航到另一个活动 Activity2,我有一些数据库代码。

现在的问题是从 DB 获取数据需要一些时间,所以在从 Activity1 导航到 Activity2 时,会出现几秒钟的空白屏幕。

为了克服这个问题,我尝试了ProgressDialog,但ProgressDialog 根本没有出现。

活动 2 中的代码 sn-p:

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

感谢任何帮助。

【问题讨论】:

  • 因为你正在实现runnable,所以删除run();在thread.start()下;
  • 你是对的。但是我没有手动调用运行,它没有被执行......
  • 检查我的答案,要使用你的 run 方法,你必须将你的可运行对象作为 Thread 对象的参数传递。
  • 使用Asynctask.. 解决你的问题..
  • 我已经对代码进行了更改。请尝试一下

标签: android android-layout android-activity progressdialog


【解决方案1】:

尝试使用 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>"));
        }
    }
  }
}

【讨论】:

    【解决方案2】:

    您必须关闭处理程序中的进度对话框。

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

    【讨论】:

    • 如果仍然没有帮助,删除 handler.sendEmptyMessage(1);在启动线程之前从 run() 并将其添加到 onCreate() 中。
    • 我试过你编辑的答案,现在进度条出现了,但它没有被解雇。
    • 你确定。你能检查你是否放置了handler.sendEmptyMessage(0);。你可能错过了。
    【解决方案3】:

    写这个:

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

    【讨论】:

      【解决方案4】:

      如果你想加载数据然后使用AsyncTask 这是最好的解决方案。

      【讨论】:

        【解决方案5】:

        在您的 onCreate 方法中,您必须将“Runnable”元素(此处为“this”)作为线程对象参数。然后,你不需要调用你的“run”方法,它会自动调用 Thread 对象的 start() 方法。

        代码示例:

        Thread thread = new Thread(this);
        thread.start();
        

        我不确定,这完全解决了您的问题,但这是使用带有可运行接口的线程的好方法。

        【讨论】:

          【解决方案6】:
              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();
          

          【讨论】:

            【解决方案7】:

            在 Activity 中显示进度对话框,而不是在数据库线程中。完成后使用 Handler 从线程发送消息并隐藏对话框。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-08-07
              • 1970-01-01
              • 2016-09-21
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多