目的:減少本地調(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();
這樣為了方便我們做拓展周蹭。
沒有達到我想象中那么好趋艘,因為我沒有去改生成代碼的插件。
但是我去改了生成代碼要用到的類凶朗,然后把東西封裝了下瓷胧。
改的類:
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)用其實我都有這個
調(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就用默認的.如果你有需要別的的 address 可以自己傳一個對象進去。
通常不需要棚愤,這里如果要改需要改生成代碼的插件搓萧。
public interface RequestListener<T> {
T request();
void onResponse(T t);
}
調(diào)用的時候傳入的接口RequestListener封裝了兩個方法。
T request();
這個方法里面執(zhí)行你需要請求網(wǎng)絡的代碼宛畦,在 io 線程瘸洛。
并且返回你得到的值,這個值是你在onResponse得到的次和。
void onResponse(T t);
這個方法是當接口請求完后回調(diào)反肋。無論成功失敗,都會回調(diào)踏施。(目前適用于我們的場景石蔗,如果有額外需求可以再考慮修改)
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這個思路是模仿 volley 中的 request。
但是他是繼承 Thread畅形,并且同樣在 RequestLifeycle 中加入相關(guān)代碼养距。可以減少內(nèi)存溢出日熬。
方法和之前的 jsonRpc的保持一致棍厌。bindTo
public void bindTo(RequestLifecycle lifecycle) {
if (lifecycle != null) {
lifecycle.onBind(this);
}
}
大致就這樣