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.