版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/50781360

转载请标明出处:http://blog.csdn.net/u010046908/article/details/50781360 本文出自:【李东的博客】

MVP的工作原理

以上是MVP的工作原理图。其中大家注意的Presenter操作View和Mode都是通过接口来实现直接的调用。

MVP的工作流程

  • Presenter负责逻辑的处理,
  • Model提供数据,
  • View负责显示。
    作为一种新的模式,在MVP中View并不直接使用Model,它们之间的通信是通过Presenter来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。
      

RxJava和Retrofit2.0使用

这二者的使用我就不罗嗦了,github中后好多demo,大家自己看。

MVP、RxJava和Reterofit2.0三者的整合现在开始讲解

首先说一下本项目的结构

  • api包主要存放网络请求接口
  • bean包中存放实体类
  • model包中存放处理数据
  • pesenter包中存放主导器
  • view包中存放界面处理

view的代码:

/**
*WeatherView 用于处理界面显示
*/
public interface WeatherView {void showProgress();void hideProgress();void loadWeather(WeatherData weatherData);
}package com.lidong.demo.android_rapid_development_of_library.mvp;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;import com.lidong.android_ibrary.LoadingUIHelper;
import com.lidong.demo.android_rapid_development_of_library.R;
import com.lidong.demo.android_rapid_development_of_library.mvp.bean.WeatherData;
import com.lidong.demo.android_rapid_development_of_library.mvp.presenter.WeatherPresenter;
import com.lidong.demo.android_rapid_development_of_library.mvp.presenter.WeatherPresenterImp;
import com.lidong.demo.android_rapid_development_of_library.mvp.view.WeatherView;import butterknife.Bind;
import butterknife.ButterKnife;
/**
*展示天气详情
*/
public class WeatherActivity extends AppCompatActivity implements WeatherView {@Bind(R.id.toolbar)Toolbar toolbar;@Bind(R.id.textView1)TextView textView1;@Bind(R.id.textView2)TextView textView2;@Bind(R.id.textView3)TextView textView3;@Bind(R.id.textView4)TextView textView4;@Bind(R.id.textView5)TextView textView5;@Bind(R.id.textView6)TextView textView6;@Bind(R.id.textView7)TextView textView7;@Bind(R.id.textView8)TextView textView8;@Bind(R.id.textView9)TextView textView9;private WeatherPresenter mWeatherPresenter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_weather);ButterKnife.bind(this);setSupportActionBar(toolbar);mWeatherPresenter = new WeatherPresenterImp(this);mWeatherPresenter.getWeatherData("2", "苏州");}@Overridepublic void showProgress() {LoadingUIHelper.showDialogForLoading(this,"获取数据",false);}@Overridepublic void hideProgress() {LoadingUIHelper.hideDialogForLoading();Toast.makeText(this,"服务器异常",Toast.LENGTH_SHORT).show();mWeatherPresenter.onUnsubscribe();}@Overridepublic void loadWeather(WeatherData weatherData) {Log.d("weatherData", "weatherData==" + weatherData.toString());textView1.setText("城市:"+weatherData.getResult().getToday().getCity());textView2.setText("日期:"+weatherData.getResult().getToday().getWeek());textView3.setText("今日温度:"+weatherData.getResult().getToday().getTemperature());textView4.setText("天气标识:" +WeatherIDUtils.transfer(weatherData.getResult().getToday().getWeather_id().getFa()));textView5.setText("穿衣指数:" + weatherData.getResult().getToday().getDressing_advice());textView6.setText("干燥指数:"+weatherData.getResult().getToday().getDressing_index());textView7.setText("紫外线强度:"+weatherData.getResult().getToday().getUv_index());textView8.setText("穿衣建议:"+weatherData.getResult().getToday().getDressing_advice());textView9.setText("旅游指数:"+weatherData.getResult().getToday().getTravel_index());}
}@Overrideprotected void onDestroy() {super.onDestroy();//取消注册mWeatherPresenter.onUnsubscribe();}

model层中的代码

/**** Created by lidong on 2016/3/2.*/
public interface WeatherModel {/*** 获取天气信息* @param format* @param city*/Subscription getWeatherData(String format, String city);}/*** Created by lidong on 2016/3/2.*/
public class WeatherModelImp  implements WeatherModel {private WeatherOnListener mWeatherOnListener;public WeatherModelImp(WeatherOnListener mWeatherOnListener) {this.mWeatherOnListener = mWeatherOnListener;}@Overridepublic void getWeatherData(String format,String city) {
@Overridepublic Subscription getWeatherData(String format,String city) {Observable<WeatherData> request = com.lidong.demo.mvp_dagger2.api.ApiManager.getWeatherData(format, city).cache();Subscription sub = request.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1<WeatherData>() {@Overridepublic void call(WeatherData weatherData) {mWeatherOnListener.onSuccess(weatherData);}}, new Action1<Throwable>() {@Overridepublic void call(Throwable throwable) {mWeatherOnListener.onFailure(throwable);}});return  sub;}/***回调接口*/public interface WeatherOnListener{void onSuccess(WeatherData s);void onFailure(Throwable e);}
}

presenter层中的代码:

/*** Created by lidong on 16/9/10.*/
public class BasePresenter {protected CompositeSubscription mCompositeSubscription;//RXjava取消注册,以避免内存泄露public void onUnsubscribe() {if (mCompositeSubscription != null && mCompositeSubscription.hasSubscriptions()) {mCompositeSubscription.unsubscribe();}}//RXjava注册public void addSubscription(Subscription subscriber) {if (mCompositeSubscription == null) {mCompositeSubscription = new CompositeSubscription();}mCompositeSubscription.add(subscriber);}
}/*** Created by lidong on 2016/3/2.*/
public abstract class WeatherPresenter extends BasePresenter{/*** 获取天气信息* @param format* @param city*/public abstract void getWeatherData(String format, String city);
}package com.lidong.demo.mvp.presenter;import android.util.Log;import com.lidong.demo.mvp.bean.WeatherData;
import com.lidong.demo.mvp.model.WeatherModel;
import com.lidong.demo.mvp.model.WeatherModelImp;
import com.lidong.demo.mvp.view.WeatherView;/*** Created by lidong on 2016/3/2.*/
public class WeatherPresenterImp  extends WeatherPresenter  implements WeatherModelImp.WeatherOnListener{/*** WeatherModel和WeatherView都是通过接口来实现,这就Java设计原则中依赖倒置原则使用*/private WeatherModel mWeatherModel;private WeatherView mWeatherView;public WeatherPresenterImp( WeatherView mWeatherView) {this.mWeatherModel = new WeatherModelImp(this);this.mWeatherView = mWeatherView;}@Overridepublic void getWeatherData(String format, String city) {mWeatherView.showProgress();addSubscription(mWeatherModel.getWeatherData(format,city));}@Overridepublic void onSuccess(WeatherData s) {mWeatherView.loadWeather(s);mWeatherView.hideProgress();Log.d("-------", "onSuccess() called with: " + "s = [" + s.toString() + "]");}@Overridepublic void onFailure(Throwable e) {mWeatherView.hideProgress();Log.d("-------", "onFailure" + e.getMessage());}
}

api层的代码

package com.lidong.demo.android_rapid_development_of_library.mvp.api;import com.lidong.demo.android_rapid_development_of_library.mvp.bean.WeatherData;import retrofit.GsonConverterFactory;
import retrofit.Retrofit;
import retrofit.RxJavaCallAdapterFactory;
import rx.Observable;/*** Created by lidong on 2016/3/2.*/
public class ApiManager {private static final String ENDPOINT = "http://v.juhe.cn";private static final Retrofit sRetrofit = new Retrofit .Builder().baseUrl(ENDPOINT).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()) // 使用RxJava作为回调适配器.build();private static final ApiManagerService apiManager = sRetrofit.create(ApiManagerService.class);/*** 获取天气数据* @param city* @return*/public static Observable<WeatherData> getWeatherData(String format, String city) {return apiManager.getWeatherData(format,city,"ad1d20bebafe0668502c8eea5ddd0333");}}package com.lidong.demo.android_rapid_development_of_library.mvp.api;import com.lidong.demo.android_rapid_development_of_library.mvp.bean.WeatherData;import retrofit.http.GET;
import retrofit.http.Query;
import rx.Observable;/*** @className:ApiManagerService* Created by lidong on 2016/3/2.*/
public interface ApiManagerService {//http://v.juhe.cn/weather/index?format=2&cityname=%E8%8B%8F%E5%B7%9E&key=ad1d20bebafe0668502c8eea5ddd0333/*** 获取数据* @param cityname* @param key* @return*/@GET("/weather/index")Observable<WeatherData> getWeatherData(@Query("format") String format,@Query("cityname") String cityname,@Query("key") String key);}

bean层的代码

package com.lidong.demo.android_rapid_development_of_library.mvp.bean;import java.util.List;/*** Created by Administrator on 2015/12/21.*/
public class WeatherData {/*** resultcode : 200* reason : successed!* result : {"sk":{"temp":"18","wind_direction":"东南风","wind_strength":"2级","humidity":"41%","time":"14:32"},"today":{"temperature":"8℃~17℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期三","city":"苏州","date_y":"2016年03月02日","dressing_index":"较冷","dressing_advice":"建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。","uv_index":"弱","comfort_index":"","wash_index":"较适宜","travel_index":"较适宜","exercise_index":"较适宜","drying_index":""},"future":[{"temperature":"8℃~17℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期三","date":"20160302"},{"temperature":"11℃~21℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期四","date":"20160303"},{"temperature":"12℃~19℃","weather":"多云转阴","weather_id":{"fa":"01","fb":"02"},"wind":"东南风3-4 级","week":"星期五","date":"20160304"},{"temperature":"10℃~19℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东北风3-4 级","week":"星期六","date":"20160305"},{"temperature":"11℃~20℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期日","date":"20160306"},{"temperature":"10℃~19℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东北风3-4 级","week":"星期一","date":"20160307"},{"temperature":"12℃~19℃","weather":"多云转阴","weather_id":{"fa":"01","fb":"02"},"wind":"东南风3-4 级","week":"星期二","date":"20160308"}]}* error_code : 0*/private String resultcode;private String reason;/*** sk : {"temp":"18","wind_direction":"东南风","wind_strength":"2级","humidity":"41%","time":"14:32"}* today : {"temperature":"8℃~17℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期三","city":"苏州","date_y":"2016年03月02日","dressing_index":"较冷","dressing_advice":"建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。","uv_index":"弱","comfort_index":"","wash_index":"较适宜","travel_index":"较适宜","exercise_index":"较适宜","drying_index":""}* future : [{"temperature":"8℃~17℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期三","date":"20160302"},{"temperature":"11℃~21℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期四","date":"20160303"},{"temperature":"12℃~19℃","weather":"多云转阴","weather_id":{"fa":"01","fb":"02"},"wind":"东南风3-4 级","week":"星期五","date":"20160304"},{"temperature":"10℃~19℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东北风3-4 级","week":"星期六","date":"20160305"},{"temperature":"11℃~20℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东南风3-4 级","week":"星期日","date":"20160306"},{"temperature":"10℃~19℃","weather":"多云","weather_id":{"fa":"01","fb":"01"},"wind":"东北风3-4 级","week":"星期一","date":"20160307"},{"temperature":"12℃~19℃","weather":"多云转阴","weather_id":{"fa":"01","fb":"02"},"wind":"东南风3-4 级","week":"星期二","date":"20160308"}]*/private ResultEntity result;private int error_code;public void setResultcode(String resultcode) {this.resultcode = resultcode;}public void setReason(String reason) {this.reason = reason;}public void setResult(ResultEntity result) {this.result = result;}public void setError_code(int error_code) {this.error_code = error_code;}public String getResultcode() {return resultcode;}public String getReason() {return reason;}public ResultEntity getResult() {return result;}public int getError_code() {return error_code;}public static class ResultEntity {/*** temp : 18* wind_direction : 东南风* wind_strength : 2级* humidity : 41%* time : 14:32*/private SkEntity sk;/*** temperature : 8℃~17℃* weather : 多云* weather_id : {"fa":"01","fb":"01"}* wind : 东南风3-4 级* week : 星期三* city : 苏州* date_y : 2016年03月02日* dressing_index : 较冷* dressing_advice : 建议着厚外套加毛衣等服装。年老体弱者宜着大衣、呢外套加羊毛衫。* uv_index : 弱* comfort_index :* wash_index : 较适宜* travel_index : 较适宜* exercise_index : 较适宜* drying_index :*/private TodayEntity today;/*** temperature : 8℃~17℃* weather : 多云* weather_id : {"fa":"01","fb":"01"}* wind : 东南风3-4 级* week : 星期三* date : 20160302*/private List<FutureEntity> future;public void setSk(SkEntity sk) {this.sk = sk;}public void setToday(TodayEntity today) {this.today = today;}public void setFuture(List<FutureEntity> future) {this.future = future;}public SkEntity getSk() {return sk;}public TodayEntity getToday() {return today;}public List<FutureEntity> getFuture() {return future;}public static class SkEntity {private String temp;private String wind_direction;private String wind_strength;private String humidity;private String time;public void setTemp(String temp) {this.temp = temp;}public void setWind_direction(String wind_direction) {this.wind_direction = wind_direction;}public void setWind_strength(String wind_strength) {this.wind_strength = wind_strength;}public void setHumidity(String humidity) {this.humidity = humidity;}public void setTime(String time) {this.time = time;}public String getTemp() {return temp;}public String getWind_direction() {return wind_direction;}public String getWind_strength() {return wind_strength;}public String getHumidity() {return humidity;}public String getTime() {return time;}@Overridepublic String toString() {return "SkEntity{" +"temp='" + temp + '\'' +", wind_direction='" + wind_direction + '\'' +", wind_strength='" + wind_strength + '\'' +", humidity='" + humidity + '\'' +", time='" + time + '\'' +'}';}}public static class TodayEntity {@Overridepublic String toString() {return "TodayEntity{" +"temperature='" + temperature + '\'' +", weather='" + weather + '\'' +", weather_id=" + weather_id +", wind='" + wind + '\'' +", week='" + week + '\'' +", city='" + city + '\'' +", date_y='" + date_y + '\'' +", dressing_index='" + dressing_index + '\'' +", dressing_advice='" + dressing_advice + '\'' +", uv_index='" + uv_index + '\'' +", comfort_index='" + comfort_index + '\'' +", wash_index='" + wash_index + '\'' +", travel_index='" + travel_index + '\'' +", exercise_index='" + exercise_index + '\'' +", drying_index='" + drying_index + '\'' +'}';}private String temperature;private String weather;/*** fa : 01* fb : 01*/private WeatherIdEntity weather_id;private String wind;private String week;private String city;private String date_y;private String dressing_index;private String dressing_advice;private String uv_index;private String comfort_index;private String wash_index;private String travel_index;private String exercise_index;private String drying_index;public void setTemperature(String temperature) {this.temperature = temperature;}public void setWeather(String weather) {this.weather = weather;}public void setWeather_id(WeatherIdEntity weather_id) {this.weather_id = weather_id;}public void setWind(String wind) {this.wind = wind;}public void setWeek(String week) {this.week = week;}public void setCity(String city) {this.city = city;}public void setDate_y(String date_y) {this.date_y = date_y;}public void setDressing_index(String dressing_index) {this.dressing_index = dressing_index;}public void setDressing_advice(String dressing_advice) {this.dressing_advice = dressing_advice;}public void setUv_index(String uv_index) {this.uv_index = uv_index;}public void setComfort_index(String comfort_index) {this.comfort_index = comfort_index;}public void setWash_index(String wash_index) {this.wash_index = wash_index;}public void setTravel_index(String travel_index) {this.travel_index = travel_index;}public void setExercise_index(String exercise_index) {this.exercise_index = exercise_index;}public void setDrying_index(String drying_index) {this.drying_index = drying_index;}public String getTemperature() {return temperature;}public String getWeather() {return weather;}public WeatherIdEntity getWeather_id() {return weather_id;}public String getWind() {return wind;}public String getWeek() {return week;}public String getCity() {return city;}public String getDate_y() {return date_y;}public String getDressing_index() {return dressing_index;}public String getDressing_advice() {return dressing_advice;}public String getUv_index() {return uv_index;}public String getComfort_index() {return comfort_index;}public String getWash_index() {return wash_index;}public String getTravel_index() {return travel_index;}public String getExercise_index() {return exercise_index;}public String getDrying_index() {return drying_index;}public static class WeatherIdEntity {private String fa;private String fb;public void setFa(String fa) {this.fa = fa;}public void setFb(String fb) {this.fb = fb;}public String getFa() {return fa;}public String getFb() {return fb;}}}public static class FutureEntity {private String temperature;private String weather;/*** fa : 01* fb : 01*/private WeatherIdEntity weather_id;private String wind;private String week;private String date;public void setTemperature(String temperature) {this.temperature = temperature;}public void setWeather(String weather) {this.weather = weather;}public void setWeather_id(WeatherIdEntity weather_id) {this.weather_id = weather_id;}public void setWind(String wind) {this.wind = wind;}public void setWeek(String week) {this.week = week;}public void setDate(String date) {this.date = date;}public String getTemperature() {return temperature;}public String getWeather() {return weather;}public WeatherIdEntity getWeather_id() {return weather_id;}public String getWind() {return wind;}public String getWeek() {return week;}public String getDate() {return date;}public static class WeatherIdEntity {private String fa;private String fb;public void setFa(String fa) {this.fa = fa;}public void setFb(String fb) {this.fb = fb;}public String getFa() {return fa;}public String getFb() {return fb;}@Overridepublic String toString() {return "WeatherIdEntity{" +"fa='" + fa + '\'' +", fb='" + fb + '\'' +'}';}}@Overridepublic String toString() {return "FutureEntity{" +"temperature='" + temperature + '\'' +", weather='" + weather + '\'' +", weather_id=" + weather_id +", wind='" + wind + '\'' +", week='" + week + '\'' +", date='" + date + '\'' +'}';}}@Overridepublic String toString() {return "ResultEntity{" +"sk=" + sk +", today=" + today +", future=" + future +'}';}}@Overridepublic String toString() {return "WeatherData{" +"resultcode='" + resultcode + '\'' +", reason='" + reason + '\'' +", result=" + result +", error_code=" + error_code +'}';}
}

总结

最后总结一下,通过使用mvp对代码进行分层之后,模块化更加的清楚,假如要换网络框架,需要修改model层和api层的代码,其他的层的代码都不需要再动,这样各层之间保持单一职责。代码的易读性变得更强了。

代码的下载地址

代码的运行效果:

欢迎大家查看。如果有问题直接回复。

Android中RxJava+Retrofit2.0+MVP模式的整合相关推荐

  1. Android使用RxJava+Retrofit2+Okhttp+MVP练习的APP

    Android使用RxJava+Retrofit2+Okhttp+MVP练习的APP 项目截图 这是我的目录结构 五步使用RxJava+Retrofit2+Okhttp+RxCache 第一步:导包 ...

  2. Android 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器aaa

    MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播 ...

  3. 基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器

    MDPlayer万能播放器 MDPlayer,基于ijkplayer+Rxjava+Rxandroid+Retrofit2.0+MVP+Material Design的android万能播放器,可以播 ...

  4. Android中常见的MVC/MVP/MVVM模式

    Android中常见的MVC/MVP/MVVM模式 经典MVC 在1979年,经典MVC模式被提出. 在当时,人们一直试图将纯粹描述思维中的对象与跟计算机环境打交道的代码隔离开来,而Trygve Re ...

  5. Android 网络框架 Retrofit2.0介绍、使用和封装

    前言 时至今日,Android的网络框架不再像之前那么到处都是,随着Google把 HttpClient直接删掉,似乎意味着Android越来越成熟.网络框架中的佼佼者Volley也不再那么光鲜,取而 ...

  6. 简析Android中的MVC、MVP架构

    MVC MVC是指Modle,View和Controller,将界面,业务逻辑和控制器分开,是一种低耦合的设计方式,适用于简单应用开发.举个简单的例子.android中的各种控件,即为View.例如, ...

  7. android wifi互传文件在哪里,如何在android中找到通过wifi直接模式传输的文件的文件名?...

    嗨我的最终目标是在两台设备之间使用 android直接api在 android中传输文件.一旦设备充当客户端,另一个充当服务器,就像在wifi直接sdk演示中一样.为此,使用服务器端口和主机地址从客户 ...

  8. retrofit 2.0 android 教程,初识Retrofit2.0

    Retrofit无疑是当下最流行的Android网络请求框架了,是Square提供的开源产品.官方网站是这样介绍Retrofit的--A type-safe HTTP client for Andro ...

  9. Android中使用retrofit2进行网络get请求查询数据和post请求上传文件

    场景 Retrofit2 Retrofit 是对 OkHttp 的封装,是主流的网络框架. 适用于Android 和 Java 的类型安全的HTTP客户端,由Square提供的. Retrofit是一 ...

最新文章

  1. redis主从复制搭建
  2. alert三秒后关闭_疏通经络后,感觉很疲倦是什么情况?
  3. C#教程5:操作算子(1)
  4. go语言 mysql卡死,Go语言MySQL优化
  5. clone()与image和 cloneTo()
  6. 热点的ap频段哪个快_WLAN中无线AP信道的划分
  7. sqlserver 人名_sqlserver上机试题
  8. 关于近期对自己的总结
  9. linux文件服务器迁移方案,服务器之间文件备份方案、如何把服务器文件自动备份到另外一台服务器?...
  10. 开课吧:浅析语音识别算法工程师能力要求
  11. PS之PS 删除时出现无法完成请求,因为智能对象不能直接进行编辑。
  12. 使用原生js实现图片放大器效果
  13. 景联文科技提供步态数据采集服务、提供21000个id步态视频训练数据集
  14. cad玻璃门怎么画_如何使用CAD画门窗 CAD怎么画门窗
  15. 目标检测:损失函数之SmoothL1Loss
  16. 计算机03年word做母亲节贺卡,word2007怎样制作电子母亲节贺卡
  17. 【iOS】调起地图进行导航(系统地图、高德、百度)
  18. 乐视:基于Docker的RDS,我们是这样做的
  19. session的概念
  20. 计蒜客 T1609 掷骰子

热门文章

  1. ModChip and more
  2. DOM相关(主要是var和let的区别用法)
  3. java 蓝桥杯 基础练习 FJ的字符串
  4. showModalDialog页面
  5. 计算传递函数乘法_软件开发教程:计算机科学最重要的32个算法
  6. php filespl,PHP SPL--遍历目录
  7. java向另一activity输入_Activity经典实例一:两个Activity传递数据和对象
  8. PHP7不能用string类名,解决thinkphp php7 Cannot use ‘String’ as class name as it is reserved...
  9. 第48次《中国互联网络发展状况统计报告》
  10. python开发的著名软件公司_软件开发公司_软件外包_项目外包平台基于Python开发一个全文检索系统...