Android中网络与数据2.5

本文讨论了在Android开发中如何改进之前的简单网络工具类,通过封装接口如HttpCallBack,处理更复杂的请求场景,包括错误处理和自定义回调。作者还展示了如何在实际项目中应用这些改进,以增强代码的可维护性和灵活性。
摘要由CSDN通过智能技术生成

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);
    }
}

效果:

可以看到已经成功了!

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飛_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值