У меня есть тема, и я пытаюсь преобразовать ее в AsyncTask. Это мой начальный код:
municipioFragment. java
package com.example.is2_app.ui.municipio;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.is2_app.R;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class municipioFragment extends Fragment {
private List<News> lstNews;
private OnListFragmentInteractionListener mListener;
public municipioFragment() {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lstNews = new ArrayList<>();
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_municipio_list, container, false);
// Set the adapter
MymunicipioRecyclerViewAdapter recyclerViewAdapter = null;
if (view instanceof RecyclerView) {
Context context = view.getContext();
RecyclerView recyclerView = (RecyclerView) view;
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerViewAdapter = new MymunicipioRecyclerViewAdapter(lstNews, mListener);
recyclerView.setAdapter(recyclerViewAdapter);
}
getURL(recyclerViewAdapter);
return view;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnListFragmentInteractionListener) {
mListener = (OnListFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnListFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnListFragmentInteractionListener {
// TODO: Update argument type and name
void onListFragmentInteraction(News item);
}
public void getURL(final MymunicipioRecyclerViewAdapter recyclerViewAdapter) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Document doc = Jsoup.connect("http://www.comune.candida.av.it").get();
Element content = doc.getElementById("b370");
Elements subcontent = content.getElementsByTag("p");
Elements links = subcontent.select("a[href]");
int i=0;
for (Element link : links) {
i=i+1;
lstNews.add(new News(Integer.toString(i),link.text(),link.attr("href")));
}
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
recyclerViewAdapter.updateData(lstNews);
}
});
}catch (IOException e) {
Element news_text = null;
news_text.append("Error: ").append(e.getMessage()).append("\n");
}
}
}).start();
}
}
Это код, который я написал, пытаясь преобразовать поток в AsyncTask:
ComuneInfoTask. java
package com.example.is2_app.tasks;
import android.os.AsyncTask;
import android.util.Log;
import com.example.is2_app.interfaces.NetworkResponseListener;
import com.example.is2_app.ui.municipio.MymunicipioRecyclerViewAdapter;
import com.example.is2_app.ui.municipio.News;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.example.is2_app.ui.municipio.municipioFragment;
public class ComuneInfoTask extends AsyncTask<List<News>, String, List<News>> {
private NetworkResponseListener networkResponseListener;
public ComuneInfoTask (NetworkResponseListener networkResponseListener){
this.networkResponseListener=networkResponseListener;
}
@Override
protected List<News> doInBackground(List<News>... lists) {
List<News> lstNews;
lstNews = new ArrayList<>();
try {
Document doc = Jsoup.connect("http://www.comune.candida.av.it").get();
Element content = doc.getElementById("b370");
Elements subcontent = content.getElementsByTag("p");
Elements links = subcontent.select("a[href]");
int i = 0;
for (Element link : links) {
i = i + 1;
lstNews.add(new News(Integer.toString(i), link.text(), link.attr("href")));
Log.d("Element added to list",link.text());
}
} catch (IOException e) {
e.printStackTrace();
}
return lstNews;
}
protected void onProgressUpdate(Void ... progress) {
super.onProgressUpdate();
}
protected void onPreExecuted() {
super.onPreExecute();
}
protected void onPostExecute(List<News> lstNews) {
Log.d("Executing: ", "onPostExecute");
super.onPostExecute(lstNews);
if(lstNews!= null){
networkResponseListener.SuccessData(lstNews);
Log.d("lstNews ", "success");
}
else {
networkResponseListener.FailedData();
Log.d("lstNews ", "failed");
}
}
}
municipioFragment. java
становится:
package com.example.is2_app.ui.municipio;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.is2_app.MainActivity;
import com.example.is2_app.R;
import com.example.is2_app.interfaces.NetworkResponseListener;
import com.example.is2_app.tasks.ComuneInfoTask;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class municipioFragment extends Fragment implements NetworkResponseListener {
private NetworkResponseListener networkResponseListener;
private List<News> lstNews;
private OnListFragmentInteractionListener mListener;
public municipioFragment() {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lstNews = new ArrayList<>();
}
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_municipio_list, container, false);
// Set the adapter
MymunicipioRecyclerViewAdapter recyclerViewAdapter = null;
if (view instanceof RecyclerView) {
Context context = view.getContext();
RecyclerView recyclerView = (RecyclerView) view;
recyclerView.setLayoutManager(new LinearLayoutManager(context));
recyclerViewAdapter = new MymunicipioRecyclerViewAdapter(lstNews, mListener);
recyclerView.setAdapter(recyclerViewAdapter);
}
getURL();
recyclerViewAdapter.updateData(lstNews);
Log.d("AsyncTask terminated :", "ok");
return view;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnListFragmentInteractionListener) {
mListener = (OnListFragmentInteractionListener) context;
} else {
throw new RuntimeException(context.toString()
+ " must implement OnListFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
@Override
public void SuccessData(List<News> data) {
Log.d("Response:","ok");
}
@Override
public void FailedData() {
}
public interface OnListFragmentInteractionListener {
// TODO: Update argument type and name
void onListFragmentInteraction(News item);
}
public void getURL() {
ComuneInfoTask comuneInfoTask = new ComuneInfoTask(municipioFragment.this);
comuneInfoTask.execute();
Log.d("Info:","task eseguito");
}
}
Интерфейс NewtworkResponseListener. java
package com.example.is2_app.interfaces;
import com.example.is2_app.ui.municipio.News;
import java.util.List;
public interface NetworkResponseListener {
void SuccessData(List<News> data);
void FailedData();
}
MymunicipioRecyclerViewAdapter. java
package com.example.is2_app.ui.municipio;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.recyclerview.widget.RecyclerView;
import com.example.is2_app.R;
import com.example.is2_app.ui.municipio.municipioFragment.OnListFragmentInteractionListener;
import java.util.List;
public class MymunicipioRecyclerViewAdapter extends RecyclerView.Adapter<MymunicipioRecyclerViewAdapter.ViewHolder> {
private final OnListFragmentInteractionListener mListener;
List<News> mData;
public MymunicipioRecyclerViewAdapter(List<News> mData, OnListFragmentInteractionListener listener) {
this.mData = mData;
this.mListener = listener;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.fragment_municipio, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.mContentView.setText(mData.get(position).getId());
holder.mContentView.setText(mData.get(position).getContent());
holder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != mListener) {
// Notify the active callbacks interface (the activity, if the
// fragment is attached to one) that an item has been selected.
mListener.onListFragmentInteraction(holder.mItem);
Toast toast = Toast.makeText(v.getContext(),mData.get(position).getLink() , Toast.LENGTH_LONG);
toast.show();
}
}
});
}
@Override
public int getItemCount() {
return mData.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
public final View mView;
public final TextView mContentView;
public News mItem;
public ViewHolder(View view) {
super(view);
mView = view;
mContentView = view.findViewById(R.id.content);
}
@Override
public String toString() {
return super.toString() + " '" + mContentView.getText() + "'";
}
}
public void updateData(List<News> mData) {
this.mData = mData;
this.notifyDataSetChanged();
}
}
Приложение запускается, но когда я пытаюсь покажите фрагмент Municipio, он зависает и ничего не показывает ... Как я могу решить эту проблему?