Android-在JSONObject请求后移动到主线程
我对Android相当陌生(只在Java中),我担心我可能没有正确地学到一些东西 目前我有一个片段显示了一个recyclerview。数据从远程Json文件加载 这是我在片段中看到的:Android-在JSONObject请求后移动到主线程,android,multithreading,Android,Multithreading,我对Android相当陌生(只在Java中),我担心我可能没有正确地学到一些东西 目前我有一个片段显示了一个recyclerview。数据从远程Json文件加载 这是我在片段中看到的: @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragmen
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_library, container, false);
libraryList = new LibraryHandler().getLibrary(new ShowListAsyncResponse() {
@Override
public void processFinished(ArrayList<Object> showArrayList) {
recyclerViewAdapter = new LibraryRecyclerViewAdapter(getContext(), libraryList);
libraryRecyclerView = v.findViewById(R.id.libraryRecyclerView);
libraryRecyclerView.setHasFixedSize(true);
libraryRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
libraryRecyclerView.setAdapter(recyclerViewAdapter);
}
});
return v;
}
@覆盖
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图v=充气机。充气(R.layout.fragment_库,容器,假);
libraryList=new LibraryHandler().getLibrary(new ShowListAsyncResponse()){
@凌驾
公共作废处理已完成(ArrayList showArrayList){
RecycleServiceAdapter=new LibraryRecycleServiceAdapter(getContext(),libraryList);
libraryRecyclerView=v.findViewById(R.id.libraryRecyclerView);
libraryRecyclerView.setHasFixedSize(真);
setLayoutManager(新的LinearLayoutManager(getActivity());
LibraryRecycleView.setAdapter(RecycleServiceAdapter);
}
});
返回v;
}
LibraryHandler是从服务器加载数据的类:
public class LibraryHandler {
private final String url = "https://path/to/api";
private ArrayList<Object> libraryList = new ArrayList<>();
public ArrayList<Object> getLibrary(final ShowListAsyncResponse callBack) {
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(
Request.Method.GET,
url,
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray showsJsonArray = response.getJSONArray("shows");
JSONArray moviesJsonArray = response.getJSONArray("movies");
// Shows
for (int i = 0; i< showsJsonArray.length(); i++) {
JSONObject showObject = showsJsonArray.getJSONObject(i);
Gson gson = new Gson();
Show show = gson.fromJson(String.valueOf(showObject), Show.class);
libraryList.add(show);
}
// Movies
for (int i = 0; i< moviesJsonArray.length(); i++) {
JSONObject movieObject = moviesJsonArray.getJSONObject(i);
Gson gson = new Gson();
Movie movie = gson.fromJson(String.valueOf(movieObject), Movie.class);
libraryList.add(movie);
}
} catch (JSONException e) {
e.printStackTrace();
}
if (null != callBack) callBack.processFinished(libraryList);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
AppController.getInstance().addToRequestQueue(jsonObjectRequest);
return libraryList;
}
公共类LibraryHandler{
私有最终字符串url=”https://path/to/api";
私有ArrayList libraryList=新ArrayList();
公共ArrayList getLibrary(最终ShowListAsyncResponse回调){
JsonObjectRequest JsonObjectRequest=新JsonObjectRequest(
Request.Method.GET,
网址,
无效的
新的Response.Listener(){
@凌驾
公共void onResponse(JSONObject响应){
试一试{
JSONArray showsJsonArray=response.getJSONArray(“shows”);
JSONArray moviesJsonArray=response.getJSONArray(“电影”);
//显示
对于(int i=0;i
界面非常简单
public interface ShowListAsyncResponse {
void processFinished(ArrayList<Object> showArrayList);
}
公共接口ShowListAsyncResponse{
void processFinished(ArrayList showArrayList);
}
我已经读到应该从主线程调用适配器代码。我是否在processFinished函数的主线程中?如果不是,我如何修改以从主线程运行这些行?文档:
Volley总是在主线程上传递解析的响应。在主线程上运行可以方便地用接收到的数据填充UI控件,因为您可以直接从响应处理程序自由修改UI控件
因此,onResponse()
回调在主线程中被触发,因此,callback.processFinished()
调用也被触发
因此,当触发processFinished()
时,您可以安全地构建RecyclerView
你可以查看更多信息
另外,请确保在主线程上运行回调时,不会对其进行繁重的工作