简体   繁体   中英

Failed to execute the AsyncTask in a Class that Extends a Fragment

My AsyncTask, RecyclerAdapter and RecycleViewHolder classes work very fine in an activity that doesn't extend a fragment. But whenever I try executing the AsyncTask in a fragment class, all I get is an IDE red flag (unreachable Statement). Someone help me on how to execute the AsyncTask in a fragment (Am using Android studio 1.5.1. I searched for answers but failed but to get one that is up to my satisfaction. Below is my code.- thanks.

public class TabFragmentNews extends Fragment {
    private static final String ARG_EXAMPLE = "this_is_a_constant";
    private String example_data;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_news, container, false);

       //Executing The Async Task Class Here
        newsupdate();

    }
    //Method For Executing The Async Task
    public void newsupdate() {
           BackgroundTask backgroundTask = new BackgroundTask(getActivity());
            backgroundTask.execute();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        example_data = getArguments().getString(ARG_EXAMPLE);
        Log.i("Fragment created with ", example_data);
    }

    public static TabFragmentNews newInstance(String example_argmument) {
        TabFragmentNews tabFragmentNews = new TabFragmentNews();
        Bundle args = new Bundle();
        args.putString(ARG_EXAMPLE, example_argmument);
        tabFragmentNews.setArguments(args);
        return tabFragmentNews;
    }

    //AsynTask Class for Downloading News Information
    class BackgroundTask extends AsyncTask<Void, News, Void> {

        Context ctx;
        Activity activity;
        RecyclerView recyclerView;
        RecyclerView.Adapter adapter;
        RecyclerView.LayoutManager layoutManager;
        ArrayList<News> arrayList = new ArrayList<>();

        public BackgroundTask(Context ctx) {
            this.ctx = ctx;
            activity = (Activity) ctx;
        }

        String json_string = "http://localhost/app/newtest.php";

        @Override
        protected void onPreExecute() {
            recyclerView = (RecyclerView) activity.findViewById(R.id.news);
            layoutManager = new LinearLayoutManager(ctx);
            recyclerView.setLayoutManager(layoutManager);
            recyclerView.setHasFixedSize(true);
            adapter = new RecyclerAdapter(arrayList);
            recyclerView.setAdapter(adapter);
        }

        @Override
        protected Void doInBackground(Void... params) {
            try {
                URL url = new URL(json_string);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                StringBuilder stringBuilder = new StringBuilder();
                String line;

                while ((line = bufferedReader.readLine()) != null) {

                    stringBuilder.append(line + "\n");

                }
                httpURLConnection.disconnect();
                String json_string = stringBuilder.toString().trim();
                JSONObject jsonObject = new JSONObject(json_string);
                JSONArray jsonArray = jsonObject.getJSONArray("server_response");
                int count = 0;
                while (count < jsonArray.length()) {

                    JSONObject JO = jsonArray.getJSONObject(count);
                    count++;
                    News news = new News(JO.getString("details"));
                    publishProgress(news);
                }

                Log.d("JSON STRING", json_string);

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

        @Override
        protected void onProgressUpdate(News... values) {
            arrayList.add(values[0]);
            adapter.notifyDataSetChanged();
        }
    }

    //RecyclerAdapter Class for populating recycler view with Information
    class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder> {

        ArrayList<News> arrayList = new ArrayList<>();

        public static final int TYPE_HEAD = 0;
        public static final int TYPE_LIST = 1;

        public RecyclerAdapter(ArrayList<News> arrayList) {
            this.arrayList = arrayList;

        }

        @Override
        public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

            if (viewType == TYPE_HEAD) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_header, parent, false);
                RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view, viewType);
                return recyclerViewHolder;
            } else if (viewType == TYPE_LIST) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_row_layout, parent, false);
                RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view, viewType);
                return recyclerViewHolder;
            }

            return null;
        }

        @Override
        public void onBindViewHolder(RecyclerViewHolder holder, final int position) {

            if (holder.viewType == TYPE_LIST) {
                final News news = arrayList.get(position - 1);
                holder.Details.setText(news.getDetails());
            }

        }

        @Override
        public int getItemCount() {
            return arrayList.size() + 1;
        }


        //Recycler View Holder Class
        class RecyclerViewHolder extends RecyclerView.ViewHolder {
            TextView Details;
            int viewType;

            public RecyclerViewHolder(View view, int viewType) {
                super(view);

                if (viewType == TYPE_LIST) {

                    Details = (TextView) itemView.findViewById(R.id.team);

                    this.viewType = TYPE_LIST;
                } else if (viewType == TYPE_HEAD) {
                    this.viewType = TYPE_HEAD;
                }

            }
        }

        @Override
        public int getItemViewType(int position) {
            if (position == 0)
                return TYPE_HEAD;
            return TYPE_LIST;
        }
    }

}

Here is the news info class:

public class News {
    private String details;

    public News(String details)
    {
        this.setDetails(details);
    }

    public String getDetails()
    {

        return details;
    }

    public void setDetails(String details)
    {
        this.details = details;
    }

}

I get a red flag(Unreachable statement) in the Public View onCreateView at executing the AsyncTask- newsupdate();

problem is in your onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

just change your onCreateView like this..

Solution:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   //Executing The Async Task Class Here
    newsupdate();
    return inflater.inflate(R.layout.fragment_news, container, false);
}

Updated:

public class TabFragmentNews extends Fragment {
     private static final String ARG_EXAMPLE = "this_is_a_constant";
     private String example_data;
     private RecyclerView recyclerView;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_news, container, false);

    recyclerView = (RecyclerView) view.findViewById(R.id.news);

    //Executing The Async Task Class Here
    newsupdate();
    return view;
}

//Method For Executing The Async Task
public void newsupdate() {
       //BackgroundTask backgroundTask = new BackgroundTask(getActivity());
       //backgroundTask.execute();
       new BackgroundTask(getActivity()).execute();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    example_data = getArguments().getString(ARG_EXAMPLE);
    Log.i("Fragment created with ", example_data);
}

public static TabFragmentNews newInstance(String example_argmument) {
    TabFragmentNews tabFragmentNews = new TabFragmentNews();
    Bundle args = new Bundle();
    args.putString(ARG_EXAMPLE, example_argmument);
    tabFragmentNews.setArguments(args);
    return tabFragmentNews;
}

//AsynTask Class for Downloading News Information
class BackgroundTask extends AsyncTask<Void, News, Void> {

    Context ctx;
    Activity activity;
    //RecyclerView recyclerView;
    RecyclerView.Adapter adapter;
    RecyclerView.LayoutManager layoutManager;
    ArrayList<News> arrayList = new ArrayList<>();

    public BackgroundTask(Context ctx) {
        this.ctx = ctx;
        activity = (Activity) ctx;
    }

    String json_string = "http://localhost/app/newtest.php";

    @Override
    protected void onPreExecute() {
        //recyclerView = (RecyclerView) activity.findViewById(R.id.news);
        layoutManager = new LinearLayoutManager(ctx);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);
        adapter = new RecyclerAdapter(arrayList);
        recyclerView.setAdapter(adapter);
    }

    @Override
    protected Void doInBackground(Void... params) {
        try {
            URL url = new URL(json_string);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            InputStream inputStream = httpURLConnection.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            StringBuilder stringBuilder = new StringBuilder();
            String line;

            while ((line = bufferedReader.readLine()) != null) {
                stringBuilder.append(line + "\n");
            }
            httpURLConnection.disconnect();
            String json_string = stringBuilder.toString().trim();
            JSONObject jsonObject = new JSONObject(json_string);
            JSONArray jsonArray = jsonObject.getJSONArray("server_response");
            int count = 0;
            while (count < jsonArray.length()) {
                JSONObject JO = jsonArray.getJSONObject(count);
                count++;
                News news = new News(JO.getString("details"));
                publishProgress(news);
            }

            Log.d("JSON STRING", json_string);

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

    @Override
    protected void onProgressUpdate(News... values) {
        arrayList.add(values[0]);
        adapter.notifyDataSetChanged();
    }
}

//RecyclerAdapter Class for populating recycler view with Information
class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.RecyclerViewHolder> {

    ArrayList<News> arrayList = new ArrayList<>();

    public static final int TYPE_HEAD = 0;
    public static final int TYPE_LIST = 1;

    public RecyclerAdapter(ArrayList<News> arrayList) {
        this.arrayList = arrayList;
    }

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_HEAD) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_header, parent, false);
            RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view, viewType);
            return recyclerViewHolder;
        } else if (viewType == TYPE_LIST) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_row_layout, parent, false);
            RecyclerViewHolder recyclerViewHolder = new RecyclerViewHolder(view, viewType);
            return recyclerViewHolder;
        }
        return null;
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, final int position) {
        if (holder.viewType == TYPE_LIST) {
            final News news = arrayList.get(position - 1);
            holder.Details.setText(news.getDetails());
        }
    }

    @Override
    public int getItemCount() {
        return arrayList.size() + 1;
    }

    //Recycler View Holder Class
    class RecyclerViewHolder extends RecyclerView.ViewHolder {
        TextView Details;
        int viewType;

        public RecyclerViewHolder(View view, int viewType) {
            super(view);
            if (viewType == TYPE_LIST) {
                Details = (TextView) itemView.findViewById(R.id.team);
                this.viewType = TYPE_LIST;
            } else if (viewType == TYPE_HEAD) {
                this.viewType = TYPE_HEAD;
            }

        }
    }

    @Override
    public int getItemViewType(int position) {
        if (position == 0)
            return TYPE_HEAD;
        return TYPE_LIST;
    }
  }
}

Just do like this only.

//Method For Executing The Async Task
public void newsupdate() {
    new BackgroundTask().execute();
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM