0

我正在使用兼容性庫v4 +。 繼其他threadsdev guide我試圖創建一個片段,從創建它的活動中調用進度對話框。 該方法使用DialogFragment顯示在AsyncTask的預執行中,並在post執行中被解散(刪除)。 因爲我沒有得到任何對話框....嗯,事實是,對話框只能在thread.sleep末尾顯示幾分之一秒。android:progress DialogFragment不顯示在AsyncTask的開頭

有人能告訴我我錯在哪裏嗎?

我有我的片段在這裏:

public class GroupsDetailsFragment extends BaseFragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View v = inflater.inflate(R.layout.fragment_groups_details, container, false); 

     return v; 
    } 



    @Override 
    public void onStart() { 
     // TODO Auto-generated method stub 
     super.onStart(); 
     loadPage(); 
    } 



    public void loadPage() { 
     Log.i(TAG, "loadPage"); 
     new LoadPageTask(getBaseActivity()).execute(); 
    } 

    public void executeLoadPagePreExecution() {Log.i(TAG, "executeLoadPagePreExecution"); } 
    public void executeLoadPageInBackground() {Log.i(TAG, "executeLoadPageInBackground"); } 
    public void executeLoadPagePostExecution() {try { 
     Thread.sleep(5000); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }Log.i(TAG, "executeRefreshPostExecution"); } 



    protected class LoadPageTask extends AsyncTask<Void, Void, String> { 
     private Context context; 

     public LoadPageTask(Context context) { 
      super(); 
      this.context = context; 
     } 

     @Override 
     protected void onPreExecute() { 
      // before the network request begins, show a progress indicator 
      getBaseActivity().showLoadingProgressDialog(context); 
      executeLoadPagePreExecution(); 
     } 

     @Override 
     protected String doInBackground(Void... params) { 
      String result = executeLoadPage(); 
      Log.i(TAG, "error message result: " + result); 
      return result; 
     } 


     // Returns null if Everything is OK. Error Message if any problem. 
     private String executeLoadPage() { 
      try { 
       executeLoadPageInBackground(); 
       return null; 
      } catch (Exception e){ 
       Log.w(TAG, e.getMessage(), e); 
       return(e.getMessage()); 
      } 
     } 

     @Override 
     protected void onPostExecute(String message) { 
      executeLoadPagePostExecution(); 
      getBaseActivity().dismissProgressDialog(); 
      if (message!=null){ 
       Utility.showMessageAlertDialog(message, context); 
      } 
     } 
    } 

} 

而且ProgressDialogFragment這是內部類是dispays片段中的FragmentActivity的:

public static class ProgressDialogFragment extends DialogFragment { 


     public static ProgressDialogFragment newInstance(String title, String message) { 
      ProgressDialogFragment fragment = new ProgressDialogFragment(); 
      Bundle args = new Bundle(); 
      args.putString("title", title); 
      args.putString("message", message); 
      fragment.setArguments(args); 

      return fragment; 
     } 

     @Override 
     public ProgressDialog onCreateDialog(Bundle savedInstanceState) { 
      String title = getArguments().getString("title"); 
      String message = getArguments().getString("message"); 

      ProgressDialog progressDialog = new ProgressDialog(getActivity()); 
      progressDialog.setTitle(title); 
      progressDialog.setMessage(message); 

      progressDialog.show(); 

      return progressDialog; 
     } 
    } 


    public void showProgressDialog(String title, String message) { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     Fragment prev = fragmentManager.findFragmentByTag("progress dialog"); 
     if(prev!=null) { 
      fragmentTransaction.remove(prev); 
     } 
     fragmentTransaction.addToBackStack(null); 

     DialogFragment newFragment = ProgressDialogFragment.newInstance(title, message); 
     newFragment.show(fragmentManager, "progress dialog"); 
     //fragmentTransaction.commit(); 
    } 

    public void removeProgressDialog() { 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

     Fragment prev = fragmentManager.findFragmentByTag("progress dialog"); 
     if(prev!=null) { 
      fragmentTransaction.remove(prev); 
     } 
     fragmentTransaction.commit(); 
    } 
+0

setprogresstate方法如何。另外你如何使用basefragment類之外的對話框片段?你可以傳遞getSupportFragmentManager嗎? – Maxrunner 2012-11-29 17:16:22

回答

0

通常你不應該暫停UI線程。那麼如何將Thread.Sleep()移入doInBackground()?這對你有用嗎?

+0

是的,我知道。這只是一個測試......然而,出於好奇之後,我決定放棄它。並且足夠有趣(至少對我的理解來說)。有人可以解釋我爲什麼嗎? – virtual82 2012-02-09 12:30:50

0

doInBackGround在這裏的工作是在一個工作線程完成的(只是不UI線程),onPostExacute就是會談的主要UI ..這就是爲什麼

0

我不認爲你應該打電話

progressDialog.show()onCreateDialog(...)