OKhttp回调接口
public abstract class OnUiCallback implements Callback { private Handler handler = OkhttpUtils.getInstance().getHandler(); public abstract void onFailed(Call call, IOException e); public abstract void onSuccess(String result) throws IOException; @Override public void onFailure(final Call call, final IOException e) { //该方式 存在问题 网络请求也跑到了主线程 待解决 //该方法就是把 线程post到handler所在的线程 handler.post(new Runnable() { @Override public void run() { onFailed(call, e); } }); } @Override public void onResponse(final Call call, final Response response) throws IOException { final String result = response.body().string(); //该方式 存在问题 网络请求也跑到了主线程 待解决 handler.post(new Runnable() { @Override public void run() { try { onSuccess(result); } catch (IOException e) { e.printStackTrace(); } } }); } }
OKhttp实现类
public class OkhttpUtils { //private static OkhttpUtils okhttpUtils = new OkhttpUtils();//饿汉式 private static OkhttpUtils instance; private final OkHttpClient okHttpClient; //构造方法要私有化 private OkhttpUtils() { //创建OkhttpClient对象 okHttpClient = new OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS)//连接超时 .writeTimeout(20, TimeUnit.SECONDS)//写入超时 .readTimeout(20, TimeUnit.SECONDS)//读取超时 .build(); handler = new Handler(Looper.getMainLooper()); } //单例模式 //懒汉式 public static OkhttpUtils getInstance() { if (instance == null) { instance = new OkhttpUtils(); } return instance; } /*饿汉式 public static OkhttpUtils getInstance(){ return okhttpUtils; }*/ private Handler handler = new Handler(Looper.getMainLooper()); public Handler getHandler(){ return handler; } /** * GET请求 * * @param url */ private OkHttpClient client; private void initOkHttpClient(){ if(client == null){ client = new OkHttpClient.Builder().build(); } } //公用的get请求方法 完成的功能不确定 public void doGet(String url, Callback callback){ initOkHttpClient(); Request request = new Request.Builder().addHeader("User-Agent","").url(url).build(); Call call = client.newCall(request); call.enqueue(callback); } /** * doget 请求 * * @param url * @param params * @param callback */ public void doGet(String url, Map<String, String> params, final Callback callback) { //判断params是否为null if (params != null) { StringBuilder sb = new StringBuilder(); sb.append("?"); //拼接参数 for (Map.Entry<String, String> entry : params.entrySet()) { sb.append(entry.getKey()); sb.append("="); sb.append(entry.getValue()); sb.append("&"); } //?mobile=12354678954&password=123456& String s = sb.toString(); String strParam = s.substring(0, s.length() - 1); url += strParam; Log.e("sdfasdf", "url = " + url); } //创建Request对象 Request request = new Request.Builder().url(url).build(); //发送请求 okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { } }); } @Override public void onResponse(Call call, Response response) throws IOException { final String string = response.body().string(); Log.e("MainActivity", "string = " + string); handler.post(new Runnable() { @Override public void run() { } }); } }); } }
model回调接口
/** * Created by zhangjunyou on 2018/4/27. */ public interface INewModel { void getNew( Callback callback); }
model实现类
/** * Created by zhangjunyou on 2018/4/27. */ public class NewModel implements INewModel { @Override public void getNew( Callback callback) { // http://365jia.cn/news/api3/365jia/news/headline?page=1 String url = "http://365jia.cn/news/api3/365jia/news/headline?page=1"; OkhttpUtils.getInstance().doGet(url, callback); } }
presenter层
public class NewPersenter { private INewActivity iNewActivity; private NewModel newModel; public NewPersenter(INewActivity iNewActivity) { this.iNewActivity = iNewActivity; newModel = new NewModel() ; } public void showRecy(){ newModel.getNew(new OnUiCallback() { private NewBean newBean; @Override public void onFailed(Call call, IOException e) { } @Override public void onSuccess(String result) throws IOException { Log.i("ss",result); Gson gson = new Gson(); NewBean newBean = gson.fromJson(result, NewBean.class); iNewActivity.showRecy(newBean); } }); } public void onDestory() { if (null != iNewActivity) { iNewActivity = null; } } }
view层回调接口
public interface INewActivity { void showRecy(NewBean newBean); }
view实现类
public class MainActivity extends AppCompatActivity implements INewActivity{ private RecyclerView mRlv; private NewPersenter persenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); persenter = new NewPersenter(this); persenter.showRecy(); } private void initView() { mRlv = (RecyclerView) findViewById(R.id.rlv); LinearLayoutManager manager = new LinearLayoutManager(this); manager.setOrientation(LinearLayoutManager.VERTICAL); mRlv.setLayoutManager(manager); } @Override public void showRecy(NewBean newBean) {
List<NewBean.DataBean> data = newBean.getData();
MyRecyAdapter myRecyAdapter = new MyRecyAdapter(this, data);
mRlv.setAdapter(myRecyAdapter);
}
}
适配器
public class MyRecyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private Context context; private List<NewBean.DataBean> data; protected ImageLoader imageLoader = ImageLoader.getInstance(); public MyRecyAdapter(Context context, List<NewBean.DataBean> data) { this.context = context; this.data = data; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.item_layout, parent, false); MyViewHolder holder = new MyViewHolder(view); return holder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { MyViewHolder holder1 = (MyViewHolder) holder; imageLoader.displayImage(data.get(position).getIcon(),holder1.iv_item); holder1.tv_item.setText(data.get(position).getTitle()); } @Override public int getItemCount() { return data.size(); } static class MyViewHolder extends RecyclerView.ViewHolder{ ImageView iv_item; TextView tv_item; public MyViewHolder(View itemView) { super(itemView); iv_item = itemView.findViewById(R.id.iv_item); tv_item = itemView.findViewById(R.id.tv_item); } } }
由于图片使用ImageLoader框架,所以在MyAPP里要初始化
/** * Created by zhangjunyou on 2018/4/27. */ public class MyApp extends Application{ @Override public void onCreate() { super.onCreate(); //创建默认的ImageLoader配置参数 ImageLoaderConfiguration configuration = ImageLoaderConfiguration .createDefault(this); //Initialize ImageLoader with configuration. ImageLoader.getInstance().init(configuration); } }