在 android 中使用 bundle 传递 URL 时传递 null

Passing null while passing URL using bundle in android

我正在做的是从 onPostExecute 方法获取 URL 并使用 bundle 将其传递给下一个片段。
我的问题是,在将数据传递给片段之前,我正在执行 Show_data() 。那为什么它给bundle.
null 第二件事,我可以在 onPostExecute 中调用 youtube 片段吗?

public class Tab2Frag extends Fragment {

    public static String PRO_ID;
    public static String youtube_url1;

    MainActivity mainActivity;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_tab2, container, false);
        new Show_data().execute();
        new Adds1().execute();

        Bundle data = new Bundle();
        data.putString("youtube_details", youtube_url1);
        System.out.println("@@2@@@"+youtube_url1);
        YouTubeFragmentActivity youTubeFragmentActivity=new YouTubeFragmentActivity();
        youTubeFragmentActivity.setArguments(data);
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.add(R.id.main, youTubeFragmentActivity).commit();


        return rootView;
    }

    @Override
    public void onAttach(Activity activity) {
        // TODO Auto-generated method stub
        super.onAttach(activity);
        mainActivity=(MainActivity)activity;
    }


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

        JSONObject jsonobject;
        JSONArray jsonarray;
        ProgressDialog mDialog;

        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
            Bundle bundle = getActivity().getIntent().getExtras();
             PRO_ID = bundle.getString("PRODUCT_ID");
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost("http://towncitycards.com/webservice_action.php?action=get_detail&id="+PRO_ID);
            try{
                HttpResponse response = httpClient.execute(httpPost);
                String data = inputStreamToString(response.getEntity().getContent());
                jsonobject = new JSONObject(data);  
                jsonarray = new JSONArray(jsonobject.getString("detail"));
                for(int j=0; j<jsonarray.length();j++){
                    JSONObject itemobj = jsonarray.getJSONObject(j);
                    //SHOW SEARCH RESULT
                    Get_detailsBeams get_detailsBeams = new Get_detailsBeams(); 

                    get_detailsBeams.setId(itemobj.getString("ID"));
                    get_detailsBeams.setYoutube(itemobj.getString("youtube_detail"));
                    get_detailsBeams.setTerms_condition(itemobj.getString("terms_condition"));


                    Log.v("Details", itemobj.toString());
                }
            }catch(Exception e){
                e.printStackTrace();
            }
            return null;
        }

        @Override
        public void onPostExecute(String result) {
            super.onPostExecute(result);

            final String youtube_url;
                try {


                            youtube_url = jobj.opt("youtube_detail").toString();
                            System.out.println("@@@@3@"+youtube_url);
                            youtube_url1=youtube_url.replace("https://www.youtube.com/watch?v=","");
                            System.out.println("@@@@3@"+youtube_url1);
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                if(mDialog!=null && mDialog.isShowing()){
                    mDialog.dismiss();
                }
                }

        }
    }

然后像这样得到它:

 Bundle extras = getArguments();
 YOU_TUBE = extras.getString("youtube_details");

My problem is that. I am executing Show_data() before passing data to fragment. Then why it is given null to bundle.

因为 Show_data() 是一个 AsyncTask,它会 运行 异步。这样 youtube_url1 将在分配到 onPostExecute.

之前通过 bundle 传递给 fragment

Can I call youtube fragment inside onPostExecute?

是的,你可以打电话,但你必须打电话。因为那是您问题的正确实施和解决方案。 将 youtube_url1 设置为捆绑在 onPostExecute 中并将该捆绑设置为碎片并开始交易。

String youtube_url;
try {
    youtube_url = jobj.opt("youtube_detail").toString();
    System.out.println("@@@@3@"+youtube_url);
    youtube_url1=youtube_url.replace("https://www.youtube.com/watch?v=","");
    System.out.println("@@@@3@"+youtube_url1);
    Bundle data = new Bundle();
    data.putString("youtube_details", youtube_url1);
    YouTubeFragmentActivity youTubeFragmentActivity=new YouTubeFragmentActivity();
    youTubeFragmentActivity.setArguments(data);
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.add(R.id.main, youTubeFragmentActivity).commit();
} catch (JSONException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
if(mDialog!=null && mDialog.isShowing()) {
    mDialog.dismiss();
}

来自AsyncTask execute()

官方文档的注释

Note: this function schedules the task on a queue for a single background thread or pool of threads depending on the platform version.