更换了老版网络框架,提升了网络请求访问速度,基本都是秒回,加载进度条都看不到,直接就闪过去了dimiss了,主要使用了Retrofit 2.0,下面介绍两种方法访问网络数据,一种是通过Bean类直接可直接得到具体的值,另一种是拿到一个json的字符串。第一种的优点在于直接通过gson进行解析到具体的实体类,然后在Bean类可拿到具体对应值,缺点是每次传参因为Bean类的不同都要写一个请求方法。第二种优点就是所有的请可以共同调用一个请求方法,传参通过Map传过去。然后得到回调json字符串。
首先在app下build.gradle添加依赖包
compile 'com.squareup.retrofit2:retrofit:2.1.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0' compile 'io.reactivex:rxandroid:1.2.0'
在AndroidManifest.xml添加权限
android:name="android.permission.INTERNET" />
创建一个Url地址类Protocol.class,这里是我写的一个可切换Url地址的一个控制器
/** * 测试地址 **/ public static String LOCAL_URL = getBaseUrl(0);//不用final修饰 因为需要动态切换服务器地址 private static String getBaseUrl(int i) { String url = ""; switch (i){ case 0: url="https://api.douban.com/v2/"; break; } return url; }
下面是写一个接口用于网络请求传参,两种传参方法都可用,
方法1:
方法一点击打开链接
方法2:
public interface RetrofitService { //结合Rxjava ,retrofit使用网络框架(这里是post请求,包含所有接口;传入参数Map) @FormUrlEncoded @POST("book/search") ObservableBaseResponsePost(@FieldMap Map , Object> map); }
创建RetrofitHelper类
public class RetrofitHelper { private Context mCntext; private int time=10;//设置网络超时时间,这里用的是10s OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(time, TimeUnit.SECONDS) .readTimeout(time,TimeUnit.SECONDS) .writeTimeout(time,TimeUnit.SECONDS) .build(); GsonConverterFactory factory = GsonConverterFactory.create(new GsonBuilder().create()); private static RetrofitHelper instance = null; private Retrofit mRetrofit = null; public static RetrofitHelper getInstance(Context context){ if (instance == null){ instance = new RetrofitHelper(context); } return instance; } private RetrofitHelper(Context mContext){ mCntext = mContext; init(); } private void init() { resetApp(); } private void resetApp() { mRetrofit = new Retrofit.Builder() .baseUrl(Protocol.LOCAL_URL) .client(client) .addConverterFactory(factory) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build(); } public RetrofitService getServer(){ return mRetrofit.create(RetrofitService.class); } }
创建一个空的接口View,注意不是Android原生View
public interface View {
}
创建接口BaseResponseView继承View
public interface BaseResponseView extends View { void onSuccess(int type,Object object); void onError(int type,String result); }
创建接口Presenter,里面实现方法可自定义
public interface Presenter { void init(); void onStop();//用于取消订阅 void attachView(View view); }
创建类BasePresenter.class
public class BasePresenter implements Presenter { private DataManager manager; private CompositeSubscription mCompositeSubscription; private Context mContext; private BaseResponseView baseResponseView; private MyLoadDialog loadDialog;//网络加载动画 public BasePresenter(Context mContext, MyLoadDialog mloadDialog) { this.mContext = mContext; loadDialog = mloadDialog; } @Override public void init() { manager = new DataManager(mContext); mCompositeSubscription = new CompositeSubscription(); } @Override public void onStop() { if (mCompositeSubscription.hasSubscriptions()) { mCompositeSubscription.unsubscribe();//取消订阅 } } @Override public void attachView(View view) { baseResponseView = (BaseResponseView) view; } //传参 ResponseBody mresPonsebady; public void baseBiography(final int type, Map, Object> map) { loadDialog.show(); mCompositeSubscription.add(manager.baseResponse(map) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer () { @Override public void onCompleted() { loadDialog.dismiss(); if (mresPonsebady != null) { baseResponseView.onSuccess(type, mresPonsebady); } } @Override public void onError(Throwable e) { e.printStackTrace(); loadDialog.dismiss(); //A包含B a.contains(b) if (e.toString().contains("java.net.SocketTimeoutException:")) { baseResponseView.onError(type, "请求失败!网络连接超时"); } else if (e.toString().contains("java.net.UnknownHostException:")) { baseResponseView.onError(type, "请求失败!请检查网络"); } } @Override public void onNext(ResponseBody responseBody) { loadDialog.dismiss(); mresPonsebady = responseBody; } }) ); }
创建类DataManager.class
public class DataManager { private RetrofitService mRetrofitService; Context context; public DataManager(Context context){ this.context=context; this.mRetrofitService = RetrofitHelper.getInstance(context).getServer(); } public Observable然后再activiy中调用baseResponse(Map ,Object> map){ return mRetrofitService.BaseResponsePost(map); } }
public class MainActivity extends AppCompatActivity imlement BaseResponseView{
private TextView text;
private Button button,login;
private BasePresenter mBasePresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView)findViewById(R.id.text);
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Map
map.put(“q”,"西游记");
map.put(“tag”,null);
map.put(“start”,0);
map.put(“count”,1);
mBasePresenter.init();
mBasePresenter = new BasePresenter(this,MyloadDialog dialog)
}
}
方法二全部代码已贴出,直接复制可用,布局文件就两个控件,就不贴出来了