1

我有一個導航抽屜,打開幾個片段,其中一個執行後臺任務使用AsyncTask加載一些數據,同時顯示一個ProgressDialog。顯示ProgressDialog,同時打開新的片段和AsyncTask

這裏的問題是ProgressDialog「幾乎」未顯示。我說「幾乎」,因爲它顯示,但只有很短的時間。

我想實現的是:點擊Navigation Drawer項,關閉Navigation Drawer,顯示ProgressDialog,用AsyncTask打開Fragment,做背景數據,關閉ProgressDialog,看數據。

它在做什麼,此刻是:點擊抽屜式導航項,被凍結,關閉導覽,展示&解僱ProgressDialog非常快,看到的數據。

我不知道它爲什麼這樣做,肯定是我沒有得到的。這裏是我的代碼:

MainActivity:

public class MainActivity extends FragmentActivity { 

    private ProgressDialog progressDialog; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // ... 

     progressDialog = new ProgressDialog(this); 

     // ... 
    } 

    @OnClick(R.id.history_menu_item) 
    protected void historyMenuItemClick() { 
     progressDialog.setMessage(getString(R.string.history_fragment_crossing_call_log)); 
     progressDialog.show(); 

     drawerLayout.closeDrawers(); 
     switchToFragment(new HistoryFragment()); 
    } 

    public void switchToFragment(final Fragment fragment) { 
     final FragmentManager fragmentManager = getSupportFragmentManager(); 

     final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.content_frame, fragment); 
     fragmentTransaction.commit(); 
    } 
} 

HistoryFragment:

public class HistoryFragment extends Fragment implements ActionBar.OnNavigationListener { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // ... 

     updateCalls(); 

     // ... 
    } 

    public void updateCalls() { 
     // ... 

     new ShowHistoryCallLog().execute().get(); 

     // ... 
    } 

    private final class ShowHistoryCallLog extends AsyncTask<Void, Void, Cursor> { 

     // ... 

     @Override 
     protected void onPostExecute(Cursor cursor) { 

      // ... 

      final ProgressDialog progressDialog = ((MainActivity) getActivity()).getProgressDialog(); 

      if (progressDialog != null && progressDialog.isShowing()) { 
       progressDialog.dismiss(); 
      } 
     } 
    } 
} 

回答

0

你應該儘量單獨的用戶界面和後臺工作多一點。我不知道這是否是最佳做法,但我使用LocalBroadcastManager來實現這一目標。

在該片段中,也可以註冊一個新的接收器這樣一個活動:

LocalBroadcastManager.getInstance(this).registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      refreshUI(); 
      //or 
      (show/dismiss)ProgressDialog(); 
     } 
    }, new IntentFilter("<any key>")")); 

,如果您現在想更新你的用戶界面,你可以在你的代碼類似的東西在任何地方撥打:

LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("<any key>")); 

您現在可以在您的Fragment和onPreExcute中註冊一個接收器,只需發送一條消息以顯示您的ProgressDialog。關閉對話框,只需發送消息在onPostExecute中關閉它。也許還有其他方法可以實現這個目標,但是這對我來說很好。