Android arrayadapter 中的 Volley 取消请求
Volley cancel request in arrayadapter with Android
我有一个 MainActivity Class 文件,在另一个文件中有 listview 和 ArrayAdapter class。
在 ArrayAdapter class 列表项中有一个按钮使用 Volley 更新远程 Rest 服务器中的记录。
我已经阅读了有关取消 Volley 请求的信息:
@Override
protected void onStop () {
super.onStop();
if (mRequestQueue != null) {
mRequestQueue.cancelAll(TAG);
}
}
我的疑问是:我是否需要注意某些 android 生命周期事件中的取消 volley 请求?
如果是,我如何将其放入 arrayadapter class?
public class MainActivity extends Activity {
ArrayList<ObjectQueue> lista = new ArrayList<ObjectQueue>();
ListviewQueueAdapter lvA;
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
Bundle args = new Bundle();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.listmain);
View v = (View) findViewById(R.id.emptymain);
lv.setEmptyView(v);
lvA = new ListviewQueueAdapter(MainActivity.this, lista);
lv.setAdapter(lvA);
lvA.setData(lista);
}
我的阵列适配器 class 是这样的:
public class ListviewQueueAdapter extends ArrayAdapter<ObjectQueue> implements Filterable {
ArrayList<ObjectQueue> items; //working values
ArrayList<ObjectQueue> origitems; // data work
private Activity context;
RequestQueue reqQueue; //Volley request
public ListviewQueueAdapter(Activity context, ArrayList<ObjectQueue> items) {
super(context, R.layout.singlerowqueue, items);
this.context = context;
this.items=items;
}
public void add(ObjectQueue oq){
this.items.add(oq);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ObjectQueue o = items.get(position);
final ViewHolder holder;
View vi = convertView;
if (vi == null){
LayoutInflater inflater = context.getLayoutInflater();
vi = inflater.inflate(R.layout.singlerowqueue, null);// e' preciso fazer o inflate pois a view nao ainda nao esta em activity alguma
holder = new ViewHolder();
holder.mbut_stat = (Button) vi.findViewById(R.id.but_status);
....
vi.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.mbut_stat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder b = new AlertDialog.Builder(context);
b.setTitle("Mudar STATUS");
String[] types = {"Normal", "Urgente", "Pendente", "Atendido"};
b.setItems(types, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
update_fila(o, which + 1);
}
});
b.show();
}
});
......
......
return vi;
}
static class ViewHolder {
Button mbut_stat;
}
private void update_fila(final ObjectQueue ob, final int st) {
reqQueue = Volley.newRequestQueue(context);
String url = Common.getServerURL() + "\"UpdateStatusFila\"";
// constructs the POST body using the parameters
JSONArray ja = new JSONArray();
...
FillSomeArray(ja);
JSONObject jsonBody = new JSONObject();
try {
jsonBody.put("_parameters", ja);
} catch (JSONException e) {
e.printStackTrace();
}
JsonObjectRequest jr = new JsonObjectRequest(Request.Method.POST, url,
jsonBody, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// TODO Auto-generated method stub
try {
dosomething()(;
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
jr.setRetryPolicy(new DefaultRetryPolicy(Common.DEFAULT_TIMEOUT_MS,
Common.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
reqQueue.add(jr);
}
您不会'need'在生命周期事件中取消请求。如果请求不再相关或不再有用,那么为您的用户节省带宽和电池寿命将是一种很好的礼仪。
你把它放在哪里是一个设计决定,取决于你的特殊需要,但你可以向你的适配器添加一个方法:
public void onStop () {
mRequestQueue.cancelAll(TAG);
}
并通过 activity:
传播生命周期调用
@Override
protected void onStop () {
super.onStop();
adapter.onStop();
}
我有一个 MainActivity Class 文件,在另一个文件中有 listview 和 ArrayAdapter class。
在 ArrayAdapter class 列表项中有一个按钮使用 Volley 更新远程 Rest 服务器中的记录。
我已经阅读了有关取消 Volley 请求的信息:
@Override
protected void onStop () {
super.onStop();
if (mRequestQueue != null) {
mRequestQueue.cancelAll(TAG);
}
}
我的疑问是:我是否需要注意某些 android 生命周期事件中的取消 volley 请求? 如果是,我如何将其放入 arrayadapter class?
public class MainActivity extends Activity {
ArrayList<ObjectQueue> lista = new ArrayList<ObjectQueue>();
ListviewQueueAdapter lvA;
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
Bundle args = new Bundle();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.listmain);
View v = (View) findViewById(R.id.emptymain);
lv.setEmptyView(v);
lvA = new ListviewQueueAdapter(MainActivity.this, lista);
lv.setAdapter(lvA);
lvA.setData(lista);
}
我的阵列适配器 class 是这样的:
public class ListviewQueueAdapter extends ArrayAdapter<ObjectQueue> implements Filterable {
ArrayList<ObjectQueue> items; //working values
ArrayList<ObjectQueue> origitems; // data work
private Activity context;
RequestQueue reqQueue; //Volley request
public ListviewQueueAdapter(Activity context, ArrayList<ObjectQueue> items) {
super(context, R.layout.singlerowqueue, items);
this.context = context;
this.items=items;
}
public void add(ObjectQueue oq){
this.items.add(oq);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ObjectQueue o = items.get(position);
final ViewHolder holder;
View vi = convertView;
if (vi == null){
LayoutInflater inflater = context.getLayoutInflater();
vi = inflater.inflate(R.layout.singlerowqueue, null);// e' preciso fazer o inflate pois a view nao ainda nao esta em activity alguma
holder = new ViewHolder();
holder.mbut_stat = (Button) vi.findViewById(R.id.but_status);
....
vi.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.mbut_stat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder b = new AlertDialog.Builder(context);
b.setTitle("Mudar STATUS");
String[] types = {"Normal", "Urgente", "Pendente", "Atendido"};
b.setItems(types, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
update_fila(o, which + 1);
}
});
b.show();
}
});
......
......
return vi;
}
static class ViewHolder {
Button mbut_stat;
}
private void update_fila(final ObjectQueue ob, final int st) {
reqQueue = Volley.newRequestQueue(context);
String url = Common.getServerURL() + "\"UpdateStatusFila\"";
// constructs the POST body using the parameters
JSONArray ja = new JSONArray();
...
FillSomeArray(ja);
JSONObject jsonBody = new JSONObject();
try {
jsonBody.put("_parameters", ja);
} catch (JSONException e) {
e.printStackTrace();
}
JsonObjectRequest jr = new JsonObjectRequest(Request.Method.POST, url,
jsonBody, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
// TODO Auto-generated method stub
try {
dosomething()(;
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
error.printStackTrace();
}
});
jr.setRetryPolicy(new DefaultRetryPolicy(Common.DEFAULT_TIMEOUT_MS,
Common.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
reqQueue.add(jr);
}
您不会'need'在生命周期事件中取消请求。如果请求不再相关或不再有用,那么为您的用户节省带宽和电池寿命将是一种很好的礼仪。
你把它放在哪里是一个设计决定,取决于你的特殊需要,但你可以向你的适配器添加一个方法:
public void onStop () {
mRequestQueue.cancelAll(TAG);
}
并通过 activity:
传播生命周期调用@Override
protected void onStop () {
super.onStop();
adapter.onStop();
}