这是一个volley封装的demo,封装思路来自一个同事,我做了一点简单的修改。
网络请求的实现类:
public class BaseRequest {
public static void StringRequestPost(final Context mContext, final int id, final String url, String tag, final Map<String, String> params, final RequestResponse vif) { BaseApplication.getHttpQueues().cancelAll(tag); StringRequest stringrequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String s) { Log.d("onResponse-->", mContext.getResources().getString(id) + "==>" + s); vif.success(id, s);//通过id区分不同的网络请求 } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Log.e("onErrorResponse", mContext.getResources().getString(id) + "==>" + volleyError.toString()); vif.error(id, volleyError);//通过id区分不同的网络请求 } }) { @Override protected Map<String, String> getParams() { return params;//可以在return 传入的参数前进行一些统一的操作,比如加入时间戳并生成接口验证的签名 } }; stringrequest.setTag(tag); BaseApplication.getHttpQueues().add(stringrequest); } }
网络请求的管理类
public class MyNetRequest { private Context context = BaseApplication.getContext(); public void requestPost(int id, String url, Map<String, String> params, RequestResponse response) { BaseRequest.StringRequestPost(context, id, url, "volley" + id, params, response); } }
网络响应的接口:
public interface RequestResponse { void success(int id, String response); void error(int id, VolleyError error); }
接口地址的存放:
public class Url { public static String get_city_weather = "https://www.apiopen.top/weatherApi";//网上免费开放的天气获取接口 }
自定义的Application:
public class BaseApplication extends Application { private static Context mContext; private static RequestQueue queues;//volley的请求队列 @Override public void onCreate() { super.onCreate(); mContext = this; queues = Volley.newRequestQueue(mContext); } public static Context getContext() { return mContext; } public static RequestQueue getHttpQueues() { return queues; } }
activity页面:
public class MainActivity extends AppCompatActivity { private TextView tv_content; private AllListener allListener = new AllListener(); private MyNetRequest request = new MyNetRequest(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViewAndEvent(); } private void initViewAndEvent() { tv_content = findViewById(R.id.tv_content); findViewById(R.id.btn).setOnClickListener(allListener); }
private void doNetWorkById(int id) { Map<String, String> params = new HashMap<>(); switch (id) { case R.string.get_city_weather: params.put("city", "杭州"); request.requestPost(id, Url.get_city_weather, params, allListener); break; } }
private class AllListener implements View.OnClickListener, RequestResponse { @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn: doNetWorkById(R.string.get_city_weather); break; } } @Override public void success(int id, String response) { try { JSONObject jsonObject = new JSONObject(response); StringBuilder builder = new StringBuilder(); builder.append("杭州实时温度为-->").append(jsonObject.getJSONObject("data").getString("wendu")).append("摄氏度"); tv_content.setText(builder.toString()); } catch (JSONException e) { e.printStackTrace(); } } @Override public void error(int id, VolleyError error) { } }
新建一个strings-network文件专门存放网络请求的id和对应的接口描述
![](https://i-blog.csdnimg.cn/blog_migrate/02ac74028e7f08f7f35481bef4c89d73.png)
log输出