gRPC簡(jiǎn)單封裝調(diào)用

目的:減少本地調(diào)用的代碼編寫

調(diào)用方式就這樣。

在調(diào)用 api之前,我們需要和 jsonrpc一樣在 app 里面初始化一些東西。

      TGrpc grpc = new TGrpc.builder()
                .setGrpcUrl("xx.xx.xx")
                .setHandler(App.handler)
                .setPort(21080)
                .setCustomerCookie(getCustomerCookie())
                .build();

這樣為了方便我們做拓展。

沒有達(dá)到我想象中那么好,因?yàn)槲覜]有去改生成代碼的插件。

但是我去改了生成代碼要用到的類,然后把東西封裝了下。
改的類:

io.grpc.stub.AbstractStub

我們生產(chǎn)的 grpc 里面用的類都是繼承AbstractStub所以我這樣封裝了下

   public AbstractStub(Channel channel, CallOptions callOptions) {
        if (channel == null) {
            this.channel = OkHttpChannelBuilder.forAddress(TGrpc.getInstance().getGrpcUrl(), TGrpc.getInstance().getPort())
                    .usePlaintext(true)
                    .build();
        } else {
            this.channel = channel;
        }
        this.callOptions = checkNotNull(callOptions, "callOptions");
        setMatadata(this);
    }

最終每次調(diào)用其實(shí)我都有這個(gè)

調(diào)用的例子:


        GrpcRequest.executeProtocol(new GrpcRequest.RequestListener<Common.ResultResp>() {
            @Override
            public Common.ResultResp request() {
                return FavouriteGrpc.newBlockingStub(null).userAddFavouriteTag(AddFavouriteTagReq.newBuilder().build());
            }

            @Override
            public void onResponse(Common.ResultResp resp) {
            }
        });

注意:

FavouriteGrpc.newBlockingStub(null)

這里要傳 null就用默認(rèn)的.如果你有需要?jiǎng)e的的 address 可以自己傳一個(gè)對(duì)象進(jìn)去。

通常不需要,這里如果要改需要改生成代碼的插件。

 public interface RequestListener<T> {
        T request();

        void onResponse(T t);
    }

調(diào)用的時(shí)候傳入的接口RequestListener封裝了兩個(gè)方法。

   T request();

這個(gè)方法里面執(zhí)行你需要請(qǐng)求網(wǎng)絡(luò)的代碼,在 io 線程。
并且返回你得到的值,這個(gè)值是你在onResponse得到的。

    void onResponse(T t);

這個(gè)方法是當(dāng)接口請(qǐng)求完后回調(diào)。無論成功失敗,都會(huì)回調(diào)。(目前適用于我們的場(chǎng)景,如果有額外需求可以再考慮修改)

GrpcRequest

package com.daigou.grpc;

import com.daigou.model.RequestLifecycle;

/**
 * Created by PengChunxiao on 2017/6/15.
 */
public class GrpcRequest<T> extends XThread {

    private final RequestListener<T> tRequestListener;
    private boolean canceled = false;
    private T t;

    private GrpcRequest(RequestListener<T> listener) {
        tRequestListener = listener;
    }

    public static <T> void executeProtocol(RequestListener<T> listener) {
        if (listener == null)
            return;
        GrpcRequest thread = new GrpcRequest<T>(listener);
        thread.start();
    }

    @Override
    public void run() {
        t = null;
        try {
            checkInterrupted();
            t = tRequestListener.request();
            checkInterrupted();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            TGrpc.getInstance().getHandler().post(new Runnable() {
                @Override
                public void run() {
                    tRequestListener.onResponse(t);
                }
            });

        }
    }

    private void checkInterrupted() throws InterruptedException {
        if (isCancelled()) {
            throw new InterruptedException();
        }
    }

    @Override
    public void interrupt() {
        cancel();
        super.interrupt();
    }


    public void cancelProtocol(final XThread thread) {
        if (thread == null)
            return;

        Thread.State state = thread.getState();
        if (state != Thread.State.TERMINATED) {
            thread.interrupt();
        }
    }


    public void bindTo(RequestLifecycle lifecycle) {
        if (lifecycle != null) {
            lifecycle.onBind(this);
        }
    }


    public void cancel() {
        canceled = true;
    }


    public boolean isCanceled() {
        return canceled;
    }


    public interface RequestListener<T> {
        T request();

        void onResponse(T t);
    }
}

GrpcRequest這個(gè)思路是模仿 volley 中的 request。
但是他是繼承 Thread,并且同樣在 RequestLifeycle 中加入相關(guān)代碼。可以減少內(nèi)存溢出。
方法和之前的 jsonRpc的保持一致。bindTo

 public void bindTo(RequestLifecycle lifecycle) {
        if (lifecycle != null) {
            lifecycle.onBind(this);
        }
    }

大致就這樣

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,996評(píng)論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,219評(píng)論 4 61
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 26,031評(píng)論 7 249
  • 今天值班,各種狀況出現(xiàn),以至于自己沒有控制住情緒,發(fā)了脾氣,回想這一天,做個(gè)流水賬的記錄吧。 夜里一點(diǎn)烤完餅干,然...
    綻蕊向陽閱讀 282評(píng)論 0 1
  • 小寶長牙發(fā)燒,前天午睡醒來持續(xù)發(fā)燒!到今天晚上八點(diǎn)多,終于自然降到37.7度。估計(jì)作戰(zhàn)成功了!兩個(gè)晚上沒睡,每天2...
    buibui_fly閱讀 227評(píng)論 0 0

友情鏈接更多精彩內(nèi)容