目的:減少本地調(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);
}
}
大致就這樣