首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程同步

线程同步
EN

Stack Overflow用户
提问于 2015-12-17 00:15:57
回答 1查看 51关注 0票数 0

我有一个描述RecyclerView的片段类。创建元素需要arrayarray是通过解析JSON形成的。当我使用良好的互联网连接,一切都好,我可以看到理想的项目清单。但是使用低速连接,我的UI是空的。

我意识到threads存在一些问题,但是我没有足够的知识来解决我的问题。

这是一个代码:

代码语言:javascript
复制
public class ListVideo extends Fragment {
private int loadLimit = 9;
private RecyclerView recyclerView;
private RecyclerAdapter adapter;
private LinearLayoutManager linearLayoutManager;
final OkHttpClient client = new OkHttpClient();
List<VideoData> videoList;
List<String> videoDataList;
JSONArray json_array_list_of_videos;
int counter = 0;
int offset;

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
                         @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.listvideofragment, container, false);
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    videoList = new ArrayList<>();
    videoDataList = new ArrayList<>();
    recyclerView = (RecyclerView) view.findViewById(R.id.list);

    loadData(offset);
    createRecycleView();
    recyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(
            linearLayoutManager) {
        @Override
        public void onLoadMore(int offset) {
            // do somthing...

            loadMoreData(offset);

        }

    });


}

private void loadMoreData(int offset) {

    loadLimit += 10;
    loadData(offset);

    adapter.notifyDataSetChanged();

}

private void loadData(final int offset) {
    try {
        Request request = new Request.Builder()
                .url("http://video.motti.be/api/video.getVideoList?offset=" +
                        offset
                        + "&limit=20")
                .build();

        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException throwable) {
                throwable.printStackTrace();
            }

            @Override
            public void onResponse(Response response) throws IOException {
                try {
                    if (!response.isSuccessful())
                        throw new IOException("Unexpected code " + response);

                    Headers responseHeaders = response.headers();
                    for (int i = 0; i < responseHeaders.size(); i++) {
                        System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
                    }

                    String json_string_obj = response.body().string();
                    JSONObject url = new JSONObject(json_string_obj);
                    json_array_list_of_videos = url.getJSONArray("data");
                    System.out.println(json_array_list_of_videos.toString());
                    for (int y = 0; y <= 9; y++) {
                        if (json_array_list_of_videos.get(y).toString().equals("A9knX0GXrg")) {
                            videoDataList.add("6kS9Tt1e47g");
                        } else {
                            videoDataList.add(json_array_list_of_videos.get(y).toString());
                            System.out.println("++++++" + json_array_list_of_videos.get(y).toString());
                        }
                    }
                    for (int i = counter; i <= loadLimit; i++) {
                        if (videoDataList == null) {
                            return;
                        } else {
                            VideoData next_queue_id = new VideoData(videoDataList.get(i));
                            videoList.add(next_queue_id);
                            counter++;

                        }
                    }


                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        });

    } catch (ArrayIndexOutOfBoundsException e) {
        e.printStackTrace();

    }

}

public void createRecycleView() {

    adapter = new RecyclerAdapter(videoList, getContext());
    linearLayoutManager = new LinearLayoutManager(getActivity());
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(linearLayoutManager);
    recyclerView.setAdapter(adapter);
}
}

我明白了,后来我得到了Responsenew adapter creates.For缺乏知识,当我难过的时候,我不知道如何用onResponse方法来做thread等。

希望你不会觉得这个问题无聊或愚蠢,并会帮助我。

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-17 00:44:05

修改适配器列表(videoList)后,需要通知适配器。

目前,loadMoreData(int offset)方法不能保证,因为loadData(offset);方法可以在修改列表之前返回(请求是异步处理的)。

你能做的就是:

adapter.notifyDataSetChanged();方法中删除loadMoreData(int offset)语句,并将其添加到onResponse(Response response)方法中。

示例:

代码语言:javascript
复制
@Override
public void onResponse(Response response) throws IOException {
    try {
        ...
        for (int i = counter; i <= loadLimit; i++) {
            if (videoDataList == null) {
                return;
            } else {
                VideoData next_queue_id = new VideoData(videoDataList.get(i));
                videoList.add(next_queue_id);
                counter++;
            }
        }
        ListVideo.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                adapter.notifyDataSetChanged();
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这种方法可能会产生其他问题,因为videoList可以由多个线程同时修改。您需要找到一种方法来同步对此列表的访问或使用线程安全列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34324554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档