我正在使用Retrofit及其大部分组件,如ErrorHandler,Callbacks和RequestInterceptor等.但我错过了像'ResponseInterceptor'这样的东西,它允许我以通用的方式过滤或读取响应中的标题,作为中心点,而不必为每个服务调用设置回调.这是目前我知道如何实现这一目标的唯一方法,但不得不在非常服务调用上显式传递回调对象.
我想要的是对任何存在特定标头的响应采取行动,因此它就像一个分析每个响应的通用对象('ResponseInterceptor').
有这样的事吗?或者更好的想法如何实现这一点,而无需在每个服务调用上设置一个Callback对象?
提前致谢!
我需要暴露一些Picasso资源来满足一个相当奇怪的请求.为此我需要将Picasso导入为库项目而不是编译的jar.我创建了一个新的Android项目,并将picasso\picasso\src\main\java(克隆主文件)的内容复制到src文件夹中.Picasso使用OkHttp,所以我下载了最新版本的jar(2.3.0)并将其放在Picasso项目的libs文件夹中; 将它添加到构建路径; 在构建路径"Order and Export"首选项中选择了jar.最后,我将Picasso项目作为一个库并将其包含在主项目中(也从libs中删除了旧的Picasso jar).
应用程序第一次尝试发出Picasso请求时,我得到以下异常:
04-12 17:04:15.956: E/AndroidRuntime(5436): java.lang.NoClassDefFoundError: com.squareup.okhttp.internal.DiskLruCache$4
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.okhttp.internal.DiskLruCache.<clinit>(DiskLruCache.java:810)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.okhttp.Cache.<init>(Cache.java:168)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:77)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:55)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:45)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.Utils$OkHttpLoaderCreator.create(Utils.java:424)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.Utils.createDefaultDownloader(Utils.java:250)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.Picasso$Builder.build(Picasso.java:832)
04-12 17:04:15.956: E/AndroidRuntime(5436): at com.squareup.picasso.Picasso.with(Picasso.java:662)
Run Code Online (Sandbox Code Playgroud)
指定的类似乎在jar中,但DiskLruCache.java似乎分为9个类文件:
$ ls DiskLruCache*
DiskLruCache$1.class DiskLruCache$4.class DiskLruCache$Entry.class
DiskLruCache$2.class DiskLruCache$Editor$1.class DiskLruCache$Snapshot.class
DiskLruCache$3.class DiskLruCache$Editor.class DiskLruCache.class
Run Code Online (Sandbox Code Playgroud)
我准备提供更多信息.任何建议都将受到高度赞赏.
编辑:
问题似乎出现在OkHttp jar中.我试图在主项目中导入它和Picasso jar(最新版本 - 2.5.2)并得到相同的例外.我没有看到任何OkHttp警告,表明一些其他线程中所述的不兼容性.
当我在同一个项目中使用Parse(Parse-1.9.3.jar)和OkHTTP版本2.0.0的1.9.3版时,我收到此错误:
java.lang.NoSuchMethodError: No virtual method setFollowRedirects(Z)V in class Lcom/squareup/okhttp/OkHttpClient; or its super classes (declaration of 'com.squareup.okhttp.OkHttpClient' appears in /data/app/XXXXXXXXXXX/base.apk:classes2.dex)
Run Code Online (Sandbox Code Playgroud)
当我将Parse降级到1.9.2时,一切正常.知道如何解决这个问题吗?
我使用Retrofit 1.9.0和OkHttp 2.0.0
compile 'com.squareup.okhttp:okhttp:2.0.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'
Run Code Online (Sandbox Code Playgroud)
但是没有找到拦截器方法
OkHttpClient client = new OkHttpClient();
client.setConnectTimeout(50000, TimeUnit.MILLISECONDS);
client.setReadTimeout(50000, TimeUnit.MILLISECONDS);
client.interceptor().add(...); // cannot resolve method interceptor
Run Code Online (Sandbox Code Playgroud)
我正在处理改造中的重试请求,这篇文章建议 如何使用OkHttp/Retrofit重试HTTP请求?
我在这里错过了一些图书馆吗?
我有一个运行良好的应用程序,但是有时在向程序中添加一些类和代码时,我的应用程序会崩溃。在我的logcat中,错误是这样的:
8871-8929/com.example.first E/AndroidRuntime? FATAL EXCEPTION: pool-4-thread-1
java.lang.NoClassDefFoundError: okio.Okio
at com.squareup.okhttp.internal.http.HttpConnection.<init> (HttpConnection.java:90)
at com.squareup.okhttp.Connection.connectSocket(Connection.java:208)
at com.squareup.okhttp.Connection.connect(Connection.java:172)
at com.squareup.okhttp.Connection.connectAndSetOwner(Connection.java:367)
at com.squareup.okhttp.OkHttpClient$1.connectAndSetOwner(OkHttpClient.java:128)
at com.squareup.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:328)
at com.squareup.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:245)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:438)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:389)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:233)
Run Code Online (Sandbox Code Playgroud)
我的gradle:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:23.1.+'
compile 'com.google.android.gms:play-services:3.2.+'
compile 'net.hockeyapp.android:HockeySDK:3.6.+'
compile 'com.googlecode.mp4parser:isoparser:1.0.+'
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:cardview-v7:23.1.0'
compile 'com.android.support:recyclerview-v7:23.0.1'
compile 'com.github.bumptech.glide:glide:+'
compile 'com.nineoldandroids:library:2.4.+'
compile 'com.koushikdutta.ion:ion:2.+'
compile 'de.greenrobot:eventbus:2.4.0'
compile 'com.github.dmytrodanylyk.circular-progress-button:library:1.1.3'
compile 'com.theartofdev.edmodo:android-image-cropper:1.0.+'
compile 'com.squareup.picasso:picasso:2.5.2'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.7.5'
compile 'com.github.rahatarmanahmed:circularprogressview:2.4.0'
compile 'com.makeramen:roundedimageview:2.1.2'
compile 'com.squareup.okio:okio:1.6.0'
}
Run Code Online (Sandbox Code Playgroud) 我想表明3 fragments在我Activity和加载数据从json任何fragments!我需要将网站数据显示Recyclerview在OkHTTP v3库中.
我想将此数据显示为离线,我的意思是,如果用户关闭数据/ wifi,则显示此数据以供离线使用.但我不想使用SQLite数据库!
对于这个想法,我使用okHttpClient cache,但找不到setCache客户端,并告诉我这个错误:图像链接
MainActivity代码:
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private ArrayList<AndroidVersion> data;
private DataAdapter adapter;
private static Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
initViews();
}
private void initViews() {
recyclerView = (RecyclerView) findViewById(R.id.card_recycler_view);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext());
recyclerView.setLayoutManager(layoutManager);
loadJSON();
}
private void loadJSON() …Run Code Online (Sandbox Code Playgroud) 很多人跟我说HttpURLConnection是基于android 4.4上的okhttp.
但是当我深入研究okhttp的代码时,OkHttpURLConnection是一个从HttpURLConnection扩展而来的子类.
那么,okhttp是基于HttpURLConnection还是HttpURLConnection基于okhttp?
我发现HttpURLConnection的工具来自rt.jar,它来自jdk.
我希望有人能告诉我okhttp和HttpURLConnection之间真正的关系
这是我从PHP服务器获取JSON字符串的代码.
当我运行这个应用程序崩溃,并说有一个错误, Response response = client.newCall(request).execute();
我做错了什么?
public class MainActivity extends Activity {
//private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new AsyncTask<Void, Void, String>(){
@Override
protected String doInBackground(Void... params) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
try {
Response response = client.newCall(request).execute();
Log.d("OkHttp", "doInBackground() called with: " + "params = [" + response.body().string() + "]");
return response.body().string();
}
catch (IOException e) {
e.printStackTrace();
}
return null; …Run Code Online (Sandbox Code Playgroud) 我发出POST请求以保护服务器,这需要相当长的时间.我想让它更快.有机会这样做吗?它看起来像这样:
private class GetTokenTask extends AsyncTask<Void, Void, String> {
private final String LOG_TAG = MainActivity.class.getSimpleName();
private Call mCallToServer;
private String mAccessToken;
private OkHttpClient mHttpClient;
private JSONObject mResponseJSON;
private Response mResponseFromServer;
@Override
protected String doInBackground(Void... params) {
mHttpClient = new OkHttpClient();
mCallToServer = mHttpClient.newCall(requestToOAuth());
try {
mResponseFromServer = mCallToServer.execute();
mResponseJSON = new JSONObject(mResponseFromServer.body().string());
mAccessToken = mResponseJSON.getString(getString(R.string.access_token_key));
Log.i(LOG_TAG, mAccessToken);
Log.i(LOG_TAG, JWTUtils.decoded(mAccessToken));
} catch (Exception e) {
e.printStackTrace();
}
return mAccessToken;
}
@Override
protected void onPostExecute(String token) {
super.onPostExecute(token);
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试为Android编写程序,并且使用okhttp进行json调用。我真的很想将我的回复返回到正在创建的线程之外。我需要为异步调用创建线程,否则会得到NetworkOnMainThreadException。问题是,即使我的responseString是类中的全局变量,我的响应字符串似乎也无法从“ onResponse”方法之外获取。由于它是异步的,因此线程不会及时运行以在返回之前在全局变量中获取我的值。在返回responseString值之前,如何确保获得响应?
这是我的代码:
public static String getUserProductCategoriesFromServer(Activity activity, final String UID, final String EXPIRY, final String CLIENT, final String ACCESSTOKEN)
{
activity.runOnUiThread(new Runnable()
{
@Override
public void run()
{
final OkHttpClient client = new OkHttpClient();
final Request request = new Request.Builder()
.url(JsonStorage.getJsonUserProductCategories())
.get()
.addHeader("access-token", ACCESSTOKEN)
.addHeader("client", CLIENT)
.addHeader("expiry", EXPIRY)
.addHeader("uid", UID)
.build();
client.newCall(request).enqueue(new Callback()
{
@Override
public void onFailure(Call call, IOException e)
{
}
@Override
public void onResponse(Call call, Response response) throws IOException
{
try
{
response = client.newCall(request).execute();
String …Run Code Online (Sandbox Code Playgroud)