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

时间:2012-06-24 21:24:42

标签: android android-widget android-button

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

我的问题是,我在onClick()的最开头放置的“请稍候,处理...”,只有在整个onClick()完成后才出现。换句话说,在整个处理完成之后。所以,我想知道,在实际处理开始之前,如何制作一个视图说“请等待,处理......”?

6 个答案:

答案 0 :(得分:1)

正如@Blundell指出的那样,您可以在单独的线程上处理长时间运行的操作,以避免冻结UI线程。但是在Android中,对于通用Handler而言,它有一个更好的选择,称为AsyncTask。有关详细信息,请参阅this教程。

答案 1 :(得分:1)

你可以通过使用AsyncTask而不做任何其他事情来做到这一点。

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

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

  • 第三次更改您的ui以显示该过程已完成或您的任何内容 想做。

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

    });

    class NewTask extends AsyncTask<String, Void, Task>{
    
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
                    //this part runs on ui thread
                    //show your "wait while processing" view
    }
    
    @Override
    protected Task doInBackground(String... arg0) {
                    //do your processing job here
                    //this part is not running on ui thread
        return task;
    }
    
    @Override
    protected void onPostExecute(Task result) {
        super.onPostExecute(result);
                    //this part runs on ui thread
                    //run after your long process finished
                    //do whatever you want here like updating ui components
    }}
    

答案 2 :(得分:0)

在另一个线程上进行处理,以便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();
     }
}

处理完成后,您需要回调UI线程以关闭oyur对话框。

Handler handler = new Handler(){
     public void handleMessage(int what){
          // dismiss your dialog
     }
};

答案 3 :(得分:0)

AsyncTasks。

  • 将进度对话框的显示放在onPreExecute
  • 在doInBackground中做你的事情
  • 更新UI中需要更新的内容,并关闭onPostExecute中的对话框

答案 4 :(得分:0)

你需要这样的东西

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中运行(因为它是一项密集型任务,我不建议这样做)

public void onClick(View v){
  //show message "Please wait, processing..."
  Runnable action = new Runnable(){

    @Override        
    public void run(){
      //Do everything you need
    }

  };
  v.post(action);
}

答案 5 :(得分:0)

将你的代码放在一个线程中并在那里使用进度对话......

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..