Java 我想在AsyncTask执行期间启动一个新片段

Java 我想在AsyncTask执行期间启动一个新片段,java,android,android-fragments,android-asynctask,Java,Android,Android Fragments,Android Asynctask,在用户通过单击submit按钮提交表单详细信息之后,当if条件[if success==1]为True时,我想切换到一个新片段。我应该如何进行 这是我的密码: class CreateNewProduct extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { pDialog = new ProgressDialog(getActivi

在用户通过单击submit按钮提交表单详细信息之后,当if条件[if success==1]为True时,我想切换到一个新片段。我应该如何进行

这是我的密码:

class CreateNewProduct extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Generating Coupon. Please Wait... ");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    protected String doInBackground(String... args) {
        String fname = inputFname.getText().toString();
        String lname = inputLname.getText().toString();
        String contact = inputContact.getText().toString();
        String email = inputEmail.getText().toString();
        String eventname = inputEventname.getText().toString();
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("fname", fname));
        params.add(new BasicNameValuePair("lname", lname));
        params.add(new BasicNameValuePair("contact", contact));
        params.add(new BasicNameValuePair("email", email));
        params.add(new BasicNameValuePair("eventname", eventname));
        JSONObject json = jsonParser.makeHttpRequest(url_create_product,
                "POST", params);

         try {
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // START A NEW FRAGMENT 

                } else {

                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        return null;
    }

    protected void onPostExecute(String file_url) {
        pDialog.dismiss();
    }
}

您不应该在后台线程中执行此操作,请尝试以下操作:

class CreateNewProduct extends AsyncTask<String, String, Integer> {

    @Override
    protected void onPreExecute() {
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Generating Coupon. Please Wait... ");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    protected String doInBackground(String... args) {
        String fname = inputFname.getText().toString();
        String lname = inputLname.getText().toString();
        String contact = inputContact.getText().toString();
        String email = inputEmail.getText().toString();
        String eventname = inputEventname.getText().toString();
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("fname", fname));
        params.add(new BasicNameValuePair("lname", lname));
        params.add(new BasicNameValuePair("contact", contact));
        params.add(new BasicNameValuePair("email", email));
        params.add(new BasicNameValuePair("eventname", eventname));
        JSONObject json = jsonParser.makeHttpRequest(url_create_product,
                "POST", params);

        try {
               int success = json.getInt(TAG_SUCCESS);
               return success;
        } catch (JSONException e) {
                e.printStackTrace();
        }
        return -1;
    }

    protected void onPostExecute(Integer success) {
        pDialog.dismiss();
        if (success == 1) {
            // START A NEW FRAGMENT          
        } else {

        }
    }
}
正如我刚才注意到的,这个异步任务很可能在片段中,这里有另一种方法:

在您的活动中:

public void addCoupon() {
    FragmentManager fragmentManager = getFragmentManager()
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    ExampleFragment fragment = new ExampleFragment();
    fragmentTransaction.add(R.id.fragment_container, fragment);
    fragmentTransaction.commit();
}
在AsyncTask onPostExecute中:

    protected void onPostExecute(Integer success) {
        pDialog.dismiss();
        if (success == 1) {
            // START A NEW FRAGMENT     
            ((MainActivity)getActivity()).addCoupon();
        } else {

        }
    }

虽然这似乎有违Android的内部工作,但我认为可以使用本地广播,如我在本文中发布的代码:


不过,我们不建议这样做。但是我认为它使您想要的成为可能。

您应该定义一个回调接口,其中可能有两个方法onSuccess和onFailure,并让您的调用活动或片段充当交换机并更改UI。这是安卓系统的良好实践之一

你可以从这篇博文中得到一个小提示


快乐编码:

因为CreateNewProduct是一个类,所以我将创建一个构造函数,将调用活动作为参数并另存为实例。在主线程上运行的onPostExecute中,我将调用activity实例中的某个方法并得到一个结果。我知道这似乎是一个丑陋的解决方案,但效果很好。我试着详细说明一下。最简单的解决方案是将AsyncTask作为activity类中的一个类。通过这种方式,您可以直接访问片段管理器。
    protected void onPostExecute(Integer success) {
        pDialog.dismiss();
        if (success == 1) {
            // START A NEW FRAGMENT     
            ((MainActivity)getActivity()).addCoupon();
        } else {

        }
    }