0

我正在使用兼容性库 v4+。按照其他线程开发指南,我正在尝试创建一个片段,该片段从创建它的活动中调用进度对话框。该方法使用在 AsyncTask 的预执行中显示的DialogFragment,并在执行后关闭(删除)。结果我没有得到任何对话框......好吧,事实是对话框在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();
    }
4

3 回答 3

0

通常你不应该暂停 UI 线程。那么如何将 Thread.Sleep() 移到 doInBackground() 中呢?这对你有用吗?

于 2012-02-09T08:44:50.517 回答
0

doInBackGround 是在工作线程(而不是 UI 线程)上完成工作的地方,onPostExacute 是与主 UI 对话的地方。这就是为什么

于 2012-07-19T18:01:12.573 回答
0

我认为你不应该打电话

onCreateDialog(...) 中的 progressDialog.show()

于 2013-01-04T15:16:45.100 回答