Android中网络与数据2.5
上篇博客写了自己简单封装的一个网络工具类。但是这个网络工具类可以说是非常的简陋。在实际项目中是用都不能用的。但是却又有一个很好的思想。这篇博客就是在对这个工具类进行更深的思考。
在上一篇博客中我们用非常简单的工具类进行了一个请求、获取、操作的功能。
但是在实际项目中我们使用往往不是简单的请求数据、获取数据、进行操作,而是更为复杂的一系列操作,比如:出错了怎么办、数据为空怎么办、数据访问的时候卡了怎么办……
种种问题都告诉我们:我们需要更多功能!这时候Runnable的局限性就暴露出来了:只能对一种结果 进行处理。如果再处理更为复杂的操作显得非常的无力。
那么这时候我们需要怎么做?
封装接口
如果我这样想呢:在调用的时候传进去一个接口。这个接口有两部分构成:成功时调用:onSuccess()、失败时调用:onError()。在调用前实现他们的方法。在进行数据处理的时候只需要进行再次调用。
因此我们可以得到这样的一个接口:(就叫HttpCallBack了)
public interface HttpCallBack { void onSuccess(String result); void onError(Exception e); }
非常简单吧。在成功的时候:调用实现过的onSuccess,结果就是字符串类的result;失败了就调用onError。
自定义的拓展
除此之外,还可以去实现结果为空:onEmpty()
、错误的请求:onBadRequest()
、未找到文件:onNoFound()
等等。完全可以按需求来定制一个自己的请求。
但是在这里就简单分为成功与失败了。
封装工具类
有了这个接口,就意味着有了不同的处理方式。因此我们就有了方向,在上一篇的工具类进行改造就好了:
public class HttpUtil { /** * 进行网络请求,封装数据 * * @param url 访问的地址 * @param callBack 回调的行为 */ public static void post(String url, HttpCallBack callBack) { new Thread() { @Override public void run() { try { URL httpUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection(); connection.setRequestMethod("POST"); // 获取连接的输入流 InputStream inputStream = connection.getInputStream(); // 创建“阅读器” BufferedReader br = new BufferedReader( new InputStreamReader(inputStream, "utf-8") ); // 处理数据 StringBuilder data = new StringBuilder("这是被封装的数据"); while (br.readLine() != null) { data.append(br.readLine()); } callBack.onSuccess(data.toString()); } catch (IOException e) { callBack.onError(e); } } }.start(); } }
如果你有不太明白的地方,请综合上一篇博客内容,或者给我留言
由于我们处理了各种问题,所以数据的保存似乎也就不重要了。在这里我们只是进行访问、处理数据;如果出问题了就简单处理。剩下的按照传进来的HttpCallBack
执行就好。那么此时调用部分就变成了这样:
public class MainActivity extends AppCompatActivity { private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = findViewById(R.id.textView); getData(); } private void getData() { // 调用新的方法 HttpUtil.post("https://www.baidu.com/", new HttpCallBack() { @Override public void onSuccess(String result) { // 在主线程中设置数据 runOnUiThread(new Runnable() { @Override public void run() { setData(result); } }); } @Override public void onError(Exception e) { // 这里完全可以自己处理错误的情况,这里简单处理了 runOnUiThread(new Runnable() { @Override public void run() { setData("error"); } }); } }); } private void setData(String data) { tv.setText(data); } }
效果:
可以看到已经成功了!