如何创建异步任务RecyclerView片段Java

如何创建异步任务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

LocationFragment类:

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();