2016-11-04 7 views
0

ボタンクラスにフラグメントクラスがあります。内容が表示されるテーブルビューを表示する必要があります。表示する内容によって4秒以上の時間がかかります。だから、ボタンのクリック後にprogressDialogを表示し、メソッドの実行後に閉じると思った。ボタンクラスの直後にフラグメントクラスのProgressDialogが表示されない

しかし、テーブルビューが表示された後のように、処理が遅れて表示されています。そのため、進行状況バーの表示に遅延があります。私はたくさんのアプローチをまだ試みていません。

以下は私が試しているコードです。

@Override 
    public void onClick(final View v) { 

     switch (v.getId()) { 
     case R.id.btn_spreadsheetAddTable: { 
      //Some code 
     } 
      break; 

     case R.id.btn_horizontalAddTable: { 

      AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { 
       @Override 
       protected Void doInBackground(Void... params) { 

        return null; 
       } 

       @Override 
       protected void onPreExecute() { 
        mProgressDialog = new ProgressDialog(getActivity()); 
        mProgressDialog.setTitle("Processing..."); 
        mProgressDialog.setMessage("Please wait."); 
        mProgressDialog.setCancelable(false); 
        mProgressDialog.setIndeterminate(true); 
        mProgressDialog.show(); 
        displayAddTableView(editIsEnabled); 

       } 

       @Override 
       protected void onPostExecute(Void result) { 
        if (mProgressDialog!=null) { 
         mProgressDialog.dismiss(); 

        } 
       } 
      }; 
      task.execute((Void[])null); 



      editIsEnabled = false; 

     } 

private void displayAddTableView(boolean editEnabled) { 
//A code to display dynamic table with dynamic data 
} 
} 

私はまた、次のURLを試してきた:

android - Progressbar Late Loading when button click

Loading Dialog, Progress Dialog on Button Click

ProgressDialog doesn't appear immediately

this.Thankあなたに私を助けてください。あなたはそれを表示するために4秒を取っていると言う

ProgressDialog mProgressDialog; 
. 
. 
.  //in oncreate 
     mProgressDialog = new ProgressDialog(getActivity()); 
     mProgressDialog.setTitle("Processing..."); 
     mProgressDialog.setMessage("Please wait."); 
     mProgressDialog.setCancelable(false); 
     mProgressDialog.setIndeterminate(true); 


. 
. 
. 
protected void onPreExecute() { 
mProgressDialog.show(); 

答えて

0

は、お使いのデバイスまたはシミュレータが。あなたは、initがダイアログ最初に進行し、その後onPreExecute上でこれを表示することができます遅いかもしれませ。あなたがやっていることは、UIスレッドではなく、バックグラウンドスレッドで行う必要があります。おそらくdisplayAddTableView(editIsEnabled);doInBackgroundに実行し、UIアップデートを投稿したいとします。

mProgressDialog.show()は、メッセージがあなたのUIスレッドがdisplayAddTableView(editIsEnabled);を実行しているビジー状態の場合、進捗スピナーが表示されません(または分割のためdisplayAddTableView(editIsEnabled);後はランニングを終えた二が表示されます)を意味し、UIメッセージキューにポストされます。

+0

私はこれを試しても、それでも動作しません。 – reetu

+0

シミュレータまたはデバイスを使用してテストしていますか? –

1

+0

私はdisplayAddTableView(editIsEnabled)をdoInBacground()から呼び出して、displayAddTableView(editIsEnabled)内のtable.showをonPostExecuteに移動しようとしました。次に、ボタンをクリックするとスピナーが表示されます。しかし、クラッシュすると例外以下の例外が発生します。java.lang.RuntimeException:Looper.prepare()を呼び出さなかったスレッド内でハンドラを作成できません。 – reetu

+0

UIを更新する 'displayAddTableView'の中には、' runOnUiThread() 'の呼び出しの中に入れる必要があります。 – pathfinderelite

+0

@reetuテーブルビューには、基本的に同じことを行う 'post'メソッドも必要です。 – pathfinderelite

0

カスタムテーブルと進行状況のデザインが同じスレッドで実行される必要があるため、トーストを追加してテーブルデザインコードをUIThreadで実行することでこの問題を解決しました。

@Override 
public void onClick(final View v) { 

    switch (v.getId()) { 
    case R.id.btn_spreadSheetAddRow: { 


     Toast.makeText(this, 
       "Loading", 
       Toast.LENGTH_SHORT).show(); 

     final Thread uiThread = new Thread(new Runnable() { 

      @Override 
      public void run() { 

       uiHandler.postDelayed(new Runnable() { 

        @Override 
        public void run() { 

         //Call the heavy table design code; 

         Toast.makeText(getApplicationContext(), 
           "Done", 
           Toast.LENGTH_SHORT).show(); 

        } 
       }, 80); 
      } 
     }); 
     uiThread.start(); 
    } 
     break; 
関連する問題