0

ボタンがあり、それを押すと、onClick() がユーザーのリクエストを処理します。ただし、これには少し時間がかかるため、このボタンを押すとすぐに「お待ちください、処理中...」と表示され、その OnClickListener が機能するようにしたいと考えています。

私の問題は、onClick() の最初に配置したこの「お待ちください、処理中...」が、onClick() 全体が完了した後にのみ表示されることです。つまり、すべての処理が完了した後です。では、実際の処理が始まる前に、「お待ちください、処理中...」というビューをどのように作成すればよいのでしょうか。

4

6 に答える 6

1

@Blundellが指摘したように、UIスレッドのフリーズを避けるために、別のスレッドで長時間実行される操作を処理できます。Handlerただし、Android では、と呼ばれる汎用のより優れた代替手段がありAsyncTaskます。詳細については、このチュートリアルを参照してください。

于 2012-06-24T21:33:41.840 に答える
1

これは、他に何もせずに AsyncTask を使用するだけで実行できます。

  • 最初に「onPreExecute」で新しい AsyncTask クラスを作成し、ui を変更して、sth を処理していることを示します。

  • 次に、「doInBackground」
    メソッドですべてのバックエンドの時間のかかるジョブを実行します (ここから UI 更新メソッドを呼び出さないでください)。

  • 3番目に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

スレッド内にurコードを配置し、そこで進行状況ダイアログを使用します...

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

このようなものが必要になります

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

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 スレッドにコールバックして、ダイアログを閉じる必要があります。

Handler handler = new Handler(){
     public void handleMessage(int what){
          // dismiss your dialog
     }
};
于 2012-06-24T21:28:42.157 に答える