package cn.zhaoliang5156.toutiao1630a.net;
import android.os.AsyncTask;
import android.text.TextUtils;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 网络工具类
* 思路:
* 1. 暴露一个请求数据的方法
* 2. 请求数据的方法中要异步请求网络
* 3. 异步任务需要访问网络
* 4. 网络回来的数据我们需要判断状态码
* 5. 需要使用接口回调传出数据
*
* @author zhaoliang
* @version 1.0
* @create 2018/7/26
*/
public class HttpUtils {
private static final HttpUtils ourInstance = new HttpUtils();
public static HttpUtils getInstance() {
return ourInstance;
}
private HttpUtils() {
}
/**
* 从网络获取数据
*
* @param url
*/
public void getDataFromServer(String url, HttpUtilsCallback callback) {
// 开启异步任务
new LoadDataTask(callback).execute(url);
}
class LoadDataTask extends AsyncTask<String, Void, String> {
private HttpUtilsCallback callback;
public LoadDataTask() {
}
public LoadDataTask(HttpUtilsCallback callback) {
this.callback = callback;
}
@Override
protected String doInBackground(String... strings) {
try {
URL url = new URL(strings[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
return inputStream2String(connection.getInputStream());
}
} catch (Exception e) {
callback.onError(e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if (!TextUtils.isEmpty(s)) {
callback.onSuccess(s);
} else {
callback.onError("没有收到数据");
}
}
}
/**
* 流转换成字符串
*
* @param inputStream
* @return
* @throws IOException
*/
private String inputStream2String(InputStream inputStream) throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = -1;
byte[] b = new byte[1024];
while ((len = inputStream.read(b)) != -1) {
outputStream.write(b, 0, len);
}
return new String(outputStream.toByteArray());
}
public interface HttpUtilsCallback {
void onSuccess(String result);
void onError(String errorMsg);
}
}
package cn.zhaoliang5156.toutiao1630a.ui.fragment.news;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import com.google.gson.Gson;
import com.handmark.pulltorefresh.library.PullToRefreshBase;
import com.handmark.pulltorefresh.library.PullToRefreshListView;
import java.util.ArrayList;
import java.util.List;
import cn.zhaoliang5156.toutiao1630a.R;
import cn.zhaoliang5156.toutiao1630a.adapter.AndroidNewsAdapter;
import cn.zhaoliang5156.toutiao1630a.bean.AndroidBean;
import cn.zhaoliang5156.toutiao1630a.net.HttpUtils;
/**
* A simple {@link Fragment} subclass.
*/
public class AndroidFragment extends Fragment {
public static final String TAG = AndroidFragment.class.getSimpleName();
private HttpUtils httpUtils;
private String url = "http://gank.io/api/data/Android/10/";
private int page = 1;
private ListHttpCallback listHttpCallback;
private PullToRefreshListView pullToRefreshListView;
private List<AndroidBean.ResultsBean> androidBeans = new ArrayList<>();
private AndroidNewsAdapter adapter;
public AndroidFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_android, container, false);
pullToRefreshListView = view.findViewById(R.id.pull_to_refresh_listview);
pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() {
@Override
public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {
}
@Override
public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {
}
});
adapter = new AndroidNewsAdapter(getActivity(), androidBeans);
pullToRefreshListView.setAdapter(adapter);
httpUtils = HttpUtils.getInstance();
listHttpCallback = new ListHttpCallback();
httpUtils.getDataFromServer(url + page, listHttpCallback);
}
class ListHttpCallback implements HttpUtils.HttpUtilsCallback {
@Override
public void onSuccess(String result) {
Log.i(TAG, "result:" + result);
Gson gson = new Gson();
AndroidBean androidBean = gson.fromJson(result, AndroidBean.class);
androidBeans.addAll(androidBean.getResults());
adapter.notifyDataSetChanged();
}
@Override
public void onError(String errorMsg) {
}
}
}