Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上的进度条在完成onClick()执行后显示_Android_Android Widget_Android Button - Fatal编程技术网

Android上的进度条在完成onClick()执行后显示

Android上的进度条在完成onClick()执行后显示,android,android-widget,android-button,Android,Android Widget,Android Button,我有一个按钮,按下它时,onClick()将处理用户的请求。但是,这需要一点时间,所以我希望在按下此按钮后立即显示一个视图“请稍候,正在处理…”,而它的OnClickListener正在执行它的操作 我的问题是,我放在onClick()开头的“请稍候,正在处理…”只有在整个onClick()完成后才会出现。换句话说,在完成整个处理之后。因此,我想知道,在实际处理开始之前,我如何创建一个视图说“请稍候,正在处理…”?在另一个线程上进行处理,以便UI可以显示您的对话框 // Show dialog

我有一个按钮,按下它时,onClick()将处理用户的请求。但是,这需要一点时间,所以我希望在按下此按钮后立即显示一个视图“请稍候,正在处理…”,而它的OnClickListener正在执行它的操作


我的问题是,我放在onClick()开头的“请稍候,正在处理…”只有在整个onClick()完成后才会出现。换句话说,在完成整个处理之后。因此,我想知道,在实际处理开始之前,我如何创建一个视图说“请稍候,正在处理…”?

在另一个线程上进行处理,以便UI可以显示您的对话框

// Show dialog

// Start a new thread , either like this or with an ASyncTask
new Thread(){
     public void run(){
        // Do your thang

         // inform the UI thread you've finished
         handler.sendEmptyMessage();
     }
}
Handler handler = new Handler(){
     public void handleMessage(int what){
          // dismiss your dialog
     }
};
处理完成后,您需要回调到UI线程以关闭您的对话框

// Show dialog

// Start a new thread , either like this or with an ASyncTask
new Thread(){
     public void run(){
        // Do your thang

         // inform the UI thread you've finished
         handler.sendEmptyMessage();
     }
}
Handler handler = new Handler(){
     public void handleMessage(int what){
          // dismiss your dialog
     }
};

正如@Blundell所指出的,您可以在单独的线程上处理长时间运行的操作,以避免冻结UI线程。然而,在Android中,有一种更好的通用
处理程序替代方案,称为。有关详细信息,请参阅教程。

异步任务

  • 将进度对话框的显示置于onPreExecute中
  • 在后台做事
  • 更新UI中需要更新的内容,并关闭onPostExecute中的对话框

    • 您将需要这样的东西

      public void onClick(View v){
        //show message "Please wait, processing..."
        Thread temp = new Thread(){
      
          @Override        
          public void run(){
            //Do everything you need
          }
      
        };
        temp.start();
      }
      
      或者,如果希望它在UIThread中运行(因为这是一项密集型任务,我不建议这样做)


      您只需使用AsyncTask即可完成此任务,而无需处理任何其他内容

      • 首先在“onPreExecute”上创建新的AsyncTask类,将ui更改为显示 你正在处理某事

      • 其次,在“doInBackground”上完成所有耗时的后端工作
        方法(不要从这里调用任何ui更新方法)

      • 第三,更改您的ui,以显示流程已完成或您需要的任何内容 想做什么

        yourUiButton.setOnClickListener(new OnClickListener() {
        
        @Override
        public void onClick(View arg0) {
            new NewTask().execute();
        }
        
        }))

        class NewTask扩展了异步任务{
        @凌驾
        受保护的void onPreExecute(){
        super.onPreExecute();
        //此部分在ui线程上运行
        //显示“处理时等待”视图
        }
        @凌驾
        受保护的任务doInBackground(字符串…arg0){
        //在这里做处理工作
        //此部件未在ui线程上运行
        返回任务;
        }
        @凌驾
        受保护的void onPostExecute(任务结果){
        super.onPostExecute(结果);
        //此部分在ui线程上运行
        //在长流程完成后运行
        //在这里做任何你想做的事情,比如更新ui组件
        }}
        

        • 将您的代码放在线程中,并在线程中使用进度对话

          void fn_longprocess() {
              m_ProgressDialog = ProgressDialog.show(this, " Please wait", "..", true);
              fn_thread = new Runnable() {
                  @Override
                  public void run() {
                    try {
          
                          // do your long process here
          
                          runOnUiThread(UI_Thread);//call your ui thread here
          
          
                      }catch (Exception e) {
                          e.printStackTrace();
                       }
                  } 
          
              };
          
              Thread thread = new Thread(null, thread1
              "thread1");
              thread.start();
          
          }
          
          
            then close your dialogue in the UI thread...hope it helps..
          

          这样的时间密集型任务通常应该用一个。onClick中的长操作是不允许的。这也可以解决不显示对话框的问题,因为任务在后台运行(就像线程一样)