-1

this is my code:

public class LatestPostFragment  extends Fragment {
private static final String TAG = LatestPostFragment.class.getSimpleName();
View rootView;
LinearLayout grid_view_wrapper;
private ViewPager viewPager;
private MyViewPagerAdapter myViewPagerAdapter;
private LinearLayout layout_dots;
private TextView[] dots;
private Integer viewPagerLength;

Typeface font;
ArrayList<Post>viewPagerItems = new ArrayList<Post>();
private List<Category> categoriesList;
public LatestPostFragment() {}

@Override
public void onResume() {
    super.onResume();
    //Get a Tracker (should auto-report)
    if (Const.Analytics_ACTIVE) {
        AnalyticsUtil.sendScreenName(getActivity(), TAG);
    }
}

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

    rootView = inflater.inflate(R.layout.fragment_latest, container, false);

    //Forcing RTL Layout, If Supports and Enabled from Const file
    Utils.forceRTLIfSupported(getActivity());

    grid_view_wrapper = (LinearLayout) rootView.findViewById(R.id.grid_view_wrapper);

    font = Typeface.createFromAsset(getActivity().getAssets(), "fonts/iran_sans.ttf");

    ConnectionDetector cd = new ConnectionDetector(this.getActivity());
    Boolean isInternetPresent = cd.isConnectingToInternet();
    if (isInternetPresent) {
        getFeaturedPosts();

        categoriesList = AppController.getInstance().getPrefManger().getFeaturedCategories();
        for (Category a : categoriesList) {
            getLatestPosts(a.getId());
        }
    }
    return rootView;
}

private void getFeaturedPosts(){
    String featured_url = Const.URL_BLOG + Const.URL_BLOG_API + Const.URL_FEATURED + "?t=" + System.currentTimeMillis();
    // making fresh volley request and getting json
    JsonObjectRequest jsonReq = new JsonObjectRequest(Request.Method.GET, featured_url, null, new Response.Listener<JSONObject>() {

        @Override
        public void onResponse(JSONObject response) {
            if (response != null) {
                try {
                    if (response.has("error")) {
                        String error = response.getString("error");
                        Toast.makeText(getActivity().getApplicationContext(), error, Toast.LENGTH_LONG).show();
                    }else {
                        if (response.isNull("feed")) {

                        }else{
                            viewPagerLength = response.getInt("total_items");

                            JSONArray feedArray = response.getJSONArray("feed");

                            for (int i = 0; i < feedArray.length(); i++) {
                                JSONObject feedObj = (JSONObject) feedArray.get(i);
                                Post item = new Post();
                                item.setId(feedObj.getInt("id"));
                                item.setName(feedObj.getString("name"));
                                item.setCategory(feedObj.getString("category"));
                                String image = feedObj.isNull("image_big") ? null : feedObj.getString("image_big");
                                item.setImge(image);
                                item.setTimeStamp(feedObj.getString("timeStamp"));
                                item.setAuthor(feedObj.getString("author"));
                                // url might be null sometimes
                                String feedUrl = feedObj.isNull("url") ? null : feedObj.getString("url");
                                item.setUrl(feedUrl);
                                viewPagerItems.add(item);
                            }

                            setupViewPager();

                        }
                    }
                }catch (JSONException es) {
                    es.printStackTrace();
                    Toast.makeText(getActivity().getApplicationContext(), "Featured: " + getString(R.string.unknown_error), Toast.LENGTH_LONG).show();
                }
            }else{

            }
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
        }
    }) {
        /** Passing some request headers **/
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Content-Type", "application/json");
            headers.put("ApiKey", Const.AuthenticationKey);
            return headers;
        }
    };

    // Adding request to volley request queue
    AppController.getInstance().addToRequestQueue(jsonReq);
}

public void setupViewPager(){
    layout_dots = (LinearLayout) rootView.findViewById(R.id.layout_dots);
    viewPager   = (ViewPager)    rootView.findViewById(R.id.view_pager);
    addBottomDots(0);
    //  viewpager change listener
    ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            addBottomDots(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {

        }
    };

    myViewPagerAdapter = new MyViewPagerAdapter();
    viewPager.setAdapter(myViewPagerAdapter);
    viewPager.addOnPageChangeListener(viewPagerPageChangeListener);
}

private void addBottomDots(int currentPage) {
    dots = new TextView[viewPagerLength];

    layout_dots.removeAllViews();
    for (int i = 0; i < Const.FeaturedView; i++) {
        dots[i] = new TextView(getActivity());
        dots[i].setText(Html.fromHtml("&#8226;"));
        dots[i].setTextSize(35);
        dots[i].setTextColor(getResources().getColor(R.color.viewpager_inactive));
        layout_dots.addView(dots[i]);
    }

    if (dots.length > 0)
        dots[currentPage].setTextColor(getResources().getColor(R.color.viewpager_active));
}

public class MyViewPagerAdapter extends PagerAdapter {
    private LayoutInflater layoutInflater;

    public MyViewPagerAdapter() {
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = layoutInflater.inflate(R.layout.viewpager_item, container, false);

        final Post p = viewPagerItems.get(position);

        TextView name = (TextView) view.findViewById(R.id.name);
        name.setTypeface(font);
        name.setTextSize(20);
        name.setText(Html.fromHtml(p.getName()));

        TextView category = (TextView) view.findViewById(R.id.category);
        category.setText(Html.fromHtml(p.getCategory()));

        ImageView img = (ImageView) view.findViewById(R.id.feedImage1);
        Picasso.with(getActivity()).load(p.getImge()).into(img);

        //TextView post_author = (TextView) view.findViewById(R.id.post_author);
        //post_author.setText(String.format(getString(R.string.post_by), Html.fromHtml(p.getAuthor())));

        CharSequence timeAgo = DateUtils.getRelativeTimeSpanString(
                Long.parseLong(p.getTimeStamp()),
                System.currentTimeMillis(), DateUtils.SECOND_IN_MILLIS);
        TextView timestamp = (TextView) view.findViewById(R.id.timestamp);
        // amin time
        DateTime dateTime = new DateTime(Long.parseLong(p.getTimeStamp()));
        dateTime.withZone(DateTimeZone.forID("Asia/Tehran"));
        Roozh jCal = new Roozh();
        jCal.GregorianToPersian(dateTime.getYear(), dateTime.getMonthOfYear(), dateTime.getDayOfMonth());
        CharSequence timeAmin = jCal.toString();
        // view time
        if(System.currentTimeMillis() - Long.parseLong(p.getTimeStamp())<604800000)
            timestamp.setText(String.format(getString(R.string.publish_on), timeAgo));
        else
            timestamp.setText(String.format(getString(R.string.publish_on), timeAmin));

        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = new Intent();
                i.setClass(getActivity(), PostViewActivity.class);
                i.putExtra(PostViewActivity.TAG_SEL_POST_ID, "P" + p.getId());
                i.putExtra(PostViewActivity.TAG_SEL_POST_TITLE, p.getName());
                startActivity(i);
            }
        });

        container.addView(view);

        return view;
    }

    @Override
    public int getCount() {
        return viewPagerItems.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object obj) {
        return view == obj;
    }


    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        View view = (View) object;
        container.removeView(view);
    }
}

private void getLatestPosts(final String category_id){
    String featured_url = Const.URL_BLOG + Const.URL_BLOG_API + Const.URL_FEATURED_CATEGORY_POST.replace("_CAT_ID_", category_id) + "?t=" + System.currentTimeMillis();
    Log.d(TAG, featured_url);
    // making fresh volley request and getting json
    JsonObjectRequest jsonReq = new JsonObjectRequest(Request.Method.GET, featured_url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            if (response != null) {
                try {
                    if (response.has("error")) {
                        String error = response.getString("error");
                        Toast.makeText(getActivity().getApplicationContext(), error, Toast.LENGTH_LONG).show();
                    }else {
                        if (response.isNull("feed")) {

                        }else{
                                LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                                View view = layoutInflater.inflate(R.layout.gridview_category, null, false);

                                final TextView category_button = (TextView) view.findViewById(R.id.btnCategory);

                                final String category_name = response.getString("category");
                                TextView category_title = (TextView) view.findViewById(R.id.category_title);
                                category_title.setText(Html.fromHtml(category_name));
                                category_title.setTypeface(font);
                                category_title.setTextSize(20);


                                category_button.setOnClickListener(new View.OnClickListener() {
                                    @Override
                                    public void onClick(View view) {
                                        ((AppCompatActivity) getActivity()).getSupportActionBar().setSubtitle(category_name);
                                        Fragment fragment = GridFragment.newInstance(GridFragment.PageType.CATEGORY, category_id, category_name);
                                        FragmentManager fragmentManager = getFragmentManager();
                                        fragmentManager.beginTransaction()
                                                .replace(R.id.frame_container, fragment).commit();
                                    }
                                });

                                LinearLayout hsv = (LinearLayout) view.findViewById(R.id.recycler_view);

                                JSONArray feedArray = response.getJSONArray("feed");
                                for (int i = 0; i < feedArray.length(); i++) {
                                    JSONObject feedObj = (JSONObject) feedArray.get(i);
                                    View lvg = layoutInflater.inflate(R.layout.listview_item_grid, null, false);

                                    TextView post_name = (TextView) lvg.findViewById(R.id.post_name);
                                    post_name.setText(Html.fromHtml(feedObj.getString("name")));

                                    ImageView img = (ImageView) lvg.findViewById(R.id.feedImage1);
                                    Picasso.with(getActivity()).load(feedObj.getString("image_big")).into(img);

                                    final Post item = new Post();
                                    item.setId(feedObj.getInt("id"));
                                    item.setName(feedObj.getString("name"));
                                /*item.setCategory(feedObj.getString("category"));
                                String image = feedObj.isNull("image_big") ? null : feedObj.getString("image_big");
                                item.setImge(image);
                                item.setTimeStamp(feedObj.getString("timeStamp"));
                                // url might be null sometimes
                                String feedUrl = feedObj.isNull("url") ? null : feedObj.getString("url");
                                item.setUrl(feedUrl);
                                postList.add(item);*/

                                    lvg.setOnClickListener(new View.OnClickListener() {
                                        @Override
                                        public void onClick(View view) {
                                            Intent i = new Intent();
                                            i.setClass(getActivity(), PostViewActivity.class);
                                            i.putExtra(PostViewActivity.TAG_SEL_POST_ID, "P" + item.getId());
                                            i.putExtra(PostViewActivity.TAG_SEL_POST_TITLE, item.getName());
                                            startActivity(i);
                                        }
                                    });


                                    hsv.addView(lvg);
                                }
                                grid_view_wrapper.addView(view);
                        }
                    }
                }catch (JSONException es) {
                    es.printStackTrace();
                    Toast.makeText(getActivity().getApplicationContext(), getString(R.string.unknown_error), Toast.LENGTH_LONG).show();
                }
            }else{

            }
        }
    }, new Response.ErrorListener() {

        @Override
        public void onErrorResponse(VolleyError error) {
            VolleyLog.d(TAG, "Error: " + error.getMessage());
        }
    }) {
        /** Passing some request headers **/
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> headers = new HashMap<String, String>();
            headers.put("Content-Type", "application/json");
            headers.put("ApiKey", Const.AuthenticationKey);
            return headers;
        }
    };

    // Adding request to volley request queue
    AppController.getInstance().addToRequestQueue(jsonReq);
}

}

I have an error in this line:

LayoutInflater layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE) 

Throwing this:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.app.Activity.getSystemService(java.lang.String)' on a null object reference
JAAD
  • 12,349
  • 7
  • 36
  • 57
Amin
  • 1
  • 1
  • 6

2 Answers2

2

Well your getActivity() can return null if the context is lost after a long running background call like when running your jsonRequest.

Maybe the user clicks the home button while the request is running, and when it returns in the onResponse method, the activity is already destroyed, thus the getActivity() call returns a null object.

There are multiple solutions to this; easiest is a null check after the getActivity() return. Also you could check this stackoverflow question

Community
  • 1
  • 1
abbath
  • 2,444
  • 4
  • 28
  • 40
1

I would suggest giving a Context to the PagerAdapter

public class MyViewPagerAdapter extends PagerAdapter {
    private Context mContext;

    public MyViewPagerAdapter(Context ctx) {
        this.mContext = ctx;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        View view = inflater.inflate(R.layout.viewpager_item, container, false);

Now, you can use that class from any context, but from the Fragment, you do

myViewPagerAdapter = new MyViewPagerAdapter(getActivity());

Though, this may still be null for alternative reasons.

OneCricketeer
  • 179,855
  • 19
  • 132
  • 245