在 android volley 中处理并发
dealing with concurrency in android volley
情况是这样的,我有 2 个 classes,一个 class 用于我的片段,一个单例用于获取我的对象。每次创建此片段时,它都会要求我的单例使用 Volley 从我的服务器使用 JSON 创建对象。但是,这导致我的单例在完全创建之前返回对象。这意味着我的片段将不显示任何内容,除非在某些情况下 HTTP 请求先完成。 (我试过记录,确实方法调用顺序不对)
有什么好方法可以在所有 HTTP 请求完成后更新我的视图? (我想将片段对象传递给我的工厂,并在 onResponse 中调用我片段的方法,但我想如果我需要我的工厂用于其他 classes,它会变得混乱吗?)
public class myFragment extends Fragment{
onCreate(){
...
UpdateUI();
}
private void updateUI(){
Factory factory = factory.get(getActivity());
things = pabrik.getThings();
...
}
}
public class Factory{
Factory factory;
List<Things> things;
private Factory(Context c){
things = new ArrayList<>();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, "10.0.2.2/...", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray arr = response.getJSONArray("user");
for (int i = 0; i < arr.length(); i++){
things.add(new Barang(arr.getJSONObject(i).getString("email"), i));
Log.d("GET", arr.getJSONObject(i).getString("email"));
}
}catch (JSONException e){
e.printStackTrace();
}
}
},
...
);
mRequestQ.add(request);
}
public static synchronized Factory get(Context c){
if(this.factory == null){
this.factory = new Factory(c);
}
return this.factory;
}
public List<Things> getThings(){
return this.Things;
}
}
volley 的主要用例是从主(事件)线程进行网络连接。因此,无论您在单例中在主线程的 onResponse 方法上做什么,都可以。 Volley 确保网络任务 运行 在单独的后台线程上,并在后台完成执行后调用 onResponse。
public class myFragment extends Fragment{
onCreate(){
...
UpdateUI();
}
private void updateUI(){
Factory factory = factory.get(getActivity());
things = new ArrayList<>();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, "10.0.2.2/...", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray arr = response.getJSONArray("user");
for (int i = 0; i < arr.length(); i++){
things.add(new Barang(arr.getJSONObject(i).getString("email"), i));
Log.d("GET", arr.getJSONObject(i).getString("email"));
//Update ListView or do something with the data
}
}catch (JSONException e){
e.printStackTrace();
}
}
},
...
);
mRequestQ.add(request);
...
}
}
PS:
如果你想使用单例,你应该传递一个监听器接口并使用处理程序和循环程序。 Handler 在后台线程中完成任务,然后通过实现接口的对象更新主线程。截击的目的是避免这些并发症。
情况是这样的,我有 2 个 classes,一个 class 用于我的片段,一个单例用于获取我的对象。每次创建此片段时,它都会要求我的单例使用 Volley 从我的服务器使用 JSON 创建对象。但是,这导致我的单例在完全创建之前返回对象。这意味着我的片段将不显示任何内容,除非在某些情况下 HTTP 请求先完成。 (我试过记录,确实方法调用顺序不对)
有什么好方法可以在所有 HTTP 请求完成后更新我的视图? (我想将片段对象传递给我的工厂,并在 onResponse 中调用我片段的方法,但我想如果我需要我的工厂用于其他 classes,它会变得混乱吗?)
public class myFragment extends Fragment{
onCreate(){
...
UpdateUI();
}
private void updateUI(){
Factory factory = factory.get(getActivity());
things = pabrik.getThings();
...
}
}
public class Factory{
Factory factory;
List<Things> things;
private Factory(Context c){
things = new ArrayList<>();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, "10.0.2.2/...", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray arr = response.getJSONArray("user");
for (int i = 0; i < arr.length(); i++){
things.add(new Barang(arr.getJSONObject(i).getString("email"), i));
Log.d("GET", arr.getJSONObject(i).getString("email"));
}
}catch (JSONException e){
e.printStackTrace();
}
}
},
...
);
mRequestQ.add(request);
}
public static synchronized Factory get(Context c){
if(this.factory == null){
this.factory = new Factory(c);
}
return this.factory;
}
public List<Things> getThings(){
return this.Things;
}
}
volley 的主要用例是从主(事件)线程进行网络连接。因此,无论您在单例中在主线程的 onResponse 方法上做什么,都可以。 Volley 确保网络任务 运行 在单独的后台线程上,并在后台完成执行后调用 onResponse。
public class myFragment extends Fragment{
onCreate(){
...
UpdateUI();
}
private void updateUI(){
Factory factory = factory.get(getActivity());
things = new ArrayList<>();
JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, "10.0.2.2/...", null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
try {
JSONArray arr = response.getJSONArray("user");
for (int i = 0; i < arr.length(); i++){
things.add(new Barang(arr.getJSONObject(i).getString("email"), i));
Log.d("GET", arr.getJSONObject(i).getString("email"));
//Update ListView or do something with the data
}
}catch (JSONException e){
e.printStackTrace();
}
}
},
...
);
mRequestQ.add(request);
...
}
}
PS: 如果你想使用单例,你应该传递一个监听器接口并使用处理程序和循环程序。 Handler 在后台线程中完成任务,然后通过实现接口的对象更新主线程。截击的目的是避免这些并发症。