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

时间:2017-04-08 09:05:00

标签: android android-fragments android-asynctask bundle

这里我正在做的是从onPostExecute方法获取URL并使用bundle将其传递给下一个片段 我的问题是,我在将数据传递给片段之前执行Show_data()。那么为什么它被赋予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");

1 个答案:

答案 0 :(得分:2)

  

我的问题是。我在传递数据之前正在执行Show_data()   分段。那么为什么它被赋予null来捆绑。

由于Show_data()AsyncTask,因此它将异步运行。以便youtube_url1onPostExecute中分配之前将onPostExecute传递给片段。

  

我可以在youtube_url1内调用youtube片段吗?

是的,你可以打电话给&amp;你得打电话。因为这是正确的实施和解决你的问题。 将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(); } &amp;将该捆绑设置为片段&amp;开始交易。

{{1}}

来自AsyncTask execute()

的官方文档的说明
  

注意:此函数会在队列中为单个任务计划任务   后台线程或线程池,具体取决于平台版本。