Android: прогресс DialogFragment не отображается в начале AsyncTask - PullRequest
0 голосов
/ 09 февраля 2012

Я использую библиотеку совместимости v4 +. Следуя другим потокам и руководству разработчика Я пытаюсь создать фрагмент, вызывающий диалог прогресса, из действия, которое его создает. Подход использует DialogFragment , отображаемый в предварительном выполнении AsyncTask и отклоняемый (удаляемый) в последующем выполнении. В результате я не получаю никакого диалогового окна .... ну, правда в том, что диалоговое окно отображается только на долю секунды в конце thread.sleep.

Может кто-нибудь сказать мне, где я не прав?

У меня есть мой фрагмент здесь:

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, который является внутренним классом 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();
    }

Ответы [ 3 ]

0 голосов
/ 19 июля 2012

doInBackGround - это место, где работа выполняется в рабочем потоке (только не в потоке пользовательского интерфейса), а onPostExacute - в том, что говорит с основным пользовательским интерфейсом. Вот почему

0 голосов
/ 04 января 2013

Я не думаю, что вы должны звонить

progressDialog.show () в onCreateDialog (...)

0 голосов
/ 09 февраля 2012

Обычно вы не должны останавливать поток пользовательского интерфейса. Так как насчет перемещения Thread.Sleep () в doInBackground ()? Это работает для вас?

...