0

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

我的问题是,我放在 onClick() 开头的“请稍候,正在处理...”,仅在整个 onClick() 完成后才出现。换句话说,在整个处理完成之后。所以,我想知道,在实际处理开始之前,如何让视图显示“请稍候,正在处理......”?

4

6 回答 6

1

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

于 2012-06-24T21:33:41.840 回答
1

你可以通过只使用 AsyncTask 来做到这一点,而无需处理任何其他事情。

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

  • 其次,在“doInBackground”方法上完成所有后端耗时的工作
    (不要从这里调用任何 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
    }}
    
于 2012-06-24T23:51:01.923 回答
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);
}
于 2012-06-24T23:48:06.733 回答
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..
于 2012-06-25T07:38:10.383 回答
0

异步任务。

  • 将进度对话框的显示放在 onPreExecute
  • 在 doInBackground 中做你的事
  • 更新 UI 中需要更新的内容,并在 onPostExecute 中关闭对话框
于 2012-06-24T23:38:14.470 回答
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
     }
};
于 2012-06-24T21:28:42.157 回答