【问题标题】:Progress dialog with thread带线程的进度对话框
【发布时间】:2011-05-10 09:54:36
【问题描述】:

我正在研究 android 中的列表视图控件。当我单击列表视图项时,我想要一个进度对话框,并且在请求的数据到来后我想停止它

好吧,我把这个对话框放在线程中,当线程停止时,我想显示另一个对话框,但实际上它不起作用,它会触发下面给出的错误

05-10 15:05:10.607:错误/AndroidRuntime(820):未捕获的处理程序:线程 MagentoBackground 由于未捕获的异常而退出 **05-10 15:05:10.617: ERROR/AndroidRuntime(820): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

我的代码是这样的

           Runnable viewQuestions = new Runnable(){
            public void run() {
                getViewAnswer(answerBean);
            }


        };
       thread =  new Thread(null, viewQuestions, "MagentoBackground");
       thread.start();
       m_ProgressDialog = ProgressDialog.show(context, "Please wait...", "Retrieving data ...", true);



      protected void getViewAnswer(AnswerBean answerBean) {
          //fetch data code
            if(viewAnswerBeans != null && viewAnswerBeans.size() > 0){
             m_ProgressDialog.dismiss();
             viewAndGiveAnswerDialog(viewAnswerBeans);
                             dialogbox.show();

         } else {
             m_ProgressDialog.dismiss();
                     dialogBox.show();

         }
      }

我的问题是这个“dialogBox.show();”不会工作它不会显示消息

谁能帮我解决这个问题

【问题讨论】:

    标签: android multithreading progressdialog


    【解决方案1】:

    出于这些目的,我建议你使用AsyncTask

    【讨论】:

      【解决方案2】:

      这是因为您正在从非 UI 线程调用 UI 组件。看看下面的链接

      http://developer.android.com/resources/articles/painless-threading.html

      【讨论】:

        【解决方案3】:

        使用处理程序

        private Handler gps_ws_handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                    m_ProgressDialog.dismiss();
                    dialogBox.show();
        
        
            }
        };
        

        【讨论】:

          【解决方案4】:

          在您的活动中创建一个处理程序。

          Handler handler = new Handler();
          

          然后在 getViewAnswer 中,向其发布消息。

          protected void getViewAnswer(AnswerBean answerBean) {
          
              //fetch data code
          
          
              handler.post(new Runnable() {
              @Override
              public void run() {
                  if(viewAnswerBeans != null && viewAnswerBeans.size() > 0){
                  m_ProgressDialog.dismiss();
                  viewAndGiveAnswerDialog(viewAnswerBeans);
                               dialogbox.show();
          
                   } else {
                  m_ProgressDialog.dismiss();
                       dialogBox.show();
          
                   }
              }
          });
            }
          

          【讨论】:

            【解决方案5】:

            对于后台任务,请使用带有 ProgressDialog 边界的 AsyncTask,如 here 所示。

            【讨论】:

              【解决方案6】:

              试试这个

              公共类 YourActivity 扩展 Activity {

              private ProgressDialog m_ProgressDialog = null;
              private Runnable viewOrders;
              private ListView mListView;
              
              @Override
              public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.yourLayout);
              
                  viewOrders = new Runnable() {
              
                      public void run() {
                          loadList();
                      }
                  };
              
                  Thread thread = new Thread(null, viewOrders, "MagentoBackground");
                  thread.start();
                  m_ProgressDialog = ProgressDialog.show(YourActivity.this, "",
                          "Get Data...", true);
              
              }
              
              private Runnable returnRes = new Runnable() {
              
                  public void run() {
              
              
              
                          mListView = (ListView) findViewById(R.id.yourList);
              
                          //create here your adapter 
              
                          mListView.setAdapter(yourAdapter);
                          mListView.setOnItemClickListener(new OnItemClickListener() {
              
                              public void onItemClick(AdapterView<?> arg0, View v,
                                      int position, long arg3) {
              
                                  //on item click
                              }
                          });
                      }
                      m_ProgressDialog.dismiss();
                  }
              };
              
              private void loadList() {
                  try {
                      /* Make your request Here
                                  The progress Dialog is dismissed automatically after request is  finished */
                      }
              
                      Thread.sleep(1000);
              
                  } catch (Exception e) {
                  }
              
                  runOnUiThread(returnRes);
              }
              

              }

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-12-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多