如何创建异步任务RecyclerView片段Java
LocationFragment类:如何创建异步任务RecyclerView片段Java,java,android,android-fragments,asynchronous,android-recyclerview,Java,Android,Android Fragments,Asynchronous,Android Recyclerview,LocationFragment类: public class LocationFragment extends Fragment { FragmentNameFactory nameFactory = new FragmentNameFactory(); List<LocationData> locationData; LocationRecyclerAdapter locationRecyclerAdapter = new Loca
public class LocationFragment extends Fragment {
FragmentNameFactory nameFactory = new FragmentNameFactory();
List<LocationData> locationData;
LocationRecyclerAdapter locationRecyclerAdapter = new LocationRecyclerAdapter(locationData);
public LocationFragment(){
//Fragment needs a constructor, can be empty
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
((MainActivity) getActivity()).setFragmentName(nameFactory.getNameNL(6));
final View view = inflater.inflate(R.layout.flocationrecylce, container, false);
new JSONAsyncTask(new JSONCallBack(){
//This method updates the UI
@Override
public void success(JSONParser jsonParser) {
final JSONParser json = jsonParser;
//This part makes sure it is able to multi thread.
//In case this method is missing the application will crash upon refreshing this fragment
locationData = json.storeJSONData();
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.locationRecyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(locationRecyclerAdapter);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
}
//In case of failure the method sprints the log to the debugging console
@Override
public void failed() {
System.out.print("Failure");
}
//Sends the task to the doInBackground method inside RSSReaderAsync, which execute the code inside RSSReader
}).execute("");
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstance){
super.onViewCreated(view, savedInstance);
}
@Override
public void onActivityCreated(Bundle savedInstance){
super.onActivityCreated(savedInstance);
}
}
JSONAsyncTask类:
public class JSONAsyncTask extends AsyncTask<String, Integer, Integer> {
private JSONCallBack jsonCallBack;
public JSONAsyncTask(JSONCallBack jsonCallBack) {
this.jsonCallBack = jsonCallBack;
}
@Override
protected Integer doInBackground(String... params) {
JSONParser parser = new JSONParser("http://grwn.ddns.net:1337/locations", "POST");
jsonCallBack.success(parser);
return null;
}
}
我知道这与异步任务有关,但我不知道我做错了什么sendRequest()函数必须发生在后台(也称为异步任务中的doinbackground)
所有这些都是因为您需要在后台线程上进行网络调用
已经说过,您可以使用截击或改装库来代替更简单的网络调用
截击
改装-
编辑:
这就是你的成功:
@Override
public void success(JSONParser jsonParser) {
final JSONParser json = jsonParser;
**locationData = json.storeJSONData();**
RecyclerView recyclerView = (RecyclerView)
view.findViewById(R.id.locationRecyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(locationRecyclerAdapter);
LinearLayoutManager linearLayoutManager = new
LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
您现在在主线程上(这就是为什么您可以更改视图并执行findviewbyid等等…)
比你尝试的还要多
locationData = json.storeJSONData();
它再次调用sendrequest,这一次是在主线程上,就像Slevin试图暗示的那样,这将修复当前的崩溃。再次告诉您,成功显然是在ui线程上调用的,storeJSONData是在使用网络,storeJSONData是从成功中调用的。。。问题很明显。@Selvin你能帮我修一下吗?我不知道从哪里开始。发布此类评论无助于您理解您的代码吗?您有两个网络操作(正如rotwang在前一个问题中所说:这段代码很混乱),一个是在asynctask中执行的,另一个不是在该方法中调用…sendRequest(),对吗?我在构造函数中调用它&对象在doinbackground中是instanciate。这个编辑将以另一种方式修复当前的崩溃问题。那条线你说得对。我应该注意到的
android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1303)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:120)
at com.android.okhttp.okio.Okio$2.read(Okio.java:136)
at com.android.okhttp.okio.AsyncTimeout$2.read(AsyncTimeout.java:211)
at com.android.okhttp.okio.RealBufferedSource.exhausted(RealBufferedSource.java:60)
at com.android.okhttp.internal.http.HttpConnection.isReadable(HttpConnection.java:155)
at com.android.okhttp.Connection.isReadable(Connection.java:417)
at com.android.okhttp.OkHttpClient$1.isReadable(OkHttpClient.java:93)
at com.android.okhttp.internal.http.HttpEngine.createNextConnection(HttpEngine.java:339)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:329)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:247)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:457)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:405)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:243)
at com.example.sande.androidhro.JSONParser.sendRequest(JSONParser.java:69)
at com.example.sande.androidhro.JSONParser.storeJSONData(JSONParser.java:92)
at com.example.sande.androidhro.LocationFragment$1$1.run(LocationFragment.java:46)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.java:6236)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:781)
@Override
public void success(JSONParser jsonParser) {
final JSONParser json = jsonParser;
**locationData = json.storeJSONData();**
RecyclerView recyclerView = (RecyclerView)
view.findViewById(R.id.locationRecyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(locationRecyclerAdapter);
LinearLayoutManager linearLayoutManager = new
LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(linearLayoutManager);
locationData = json.storeJSONData();