我正在使用Reterfit来处理来自Mobile的服务器端数据。在实施改造后,我得到以下异常。
我做错了什么?
mRetrofit = new Retrofit.Builder()
.baseUrl(AppConstance.APP_URL)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(getOkHttpClient())
.build();
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion '23.0.3'
defaultConfig {
applicationId "com.name.App_idea"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "9"
multiDexEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-scalars:2.0.0'
compile 'com.google.code.gson:gson:2.2.4'
compile 'com.squareup.retrofit2:converter-gson:2.0.0'
compile 'com.jakewharton:butterknife:7.0.1'
compile 'com.android.support:design:23.3.0'
compile 'com.android.support:cardview-v7:23.3.0'
compile 'com.google.android.gms:play-services:8.4.0'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okhttp3:okhttp-urlconnection:3.2.0'
compile 'com.android.support:support-v4:23.3.0'
}
应用程序类
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Environment;
import android.support.multidex.MultiDex;
import android.util.Log;
import java.io.File;
import java.security.cert.CertificateException;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.converter.scalars.ScalarsConverterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
public class Idea extends Application {
public static Retrofit mRetrofit;
public static IdeaService Iservice;
public static LoginResponceModel loinResponce;
public static SettingsModel settingModel;
public static LocationModel location = new LocationModel();
private static SQLiteDatabase dbase;
private static String FILE_PATH;
public static SQLiteDatabase getDataBase() {
return dbase;
}
public static String getFilePath() {
return FILE_PATH;
}
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, "App", null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(AppConstance.DbConstans.tblLogin);
Log.i("DB", "Created");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onCreate(db);
}
}
public static void deleteAllTables() {
getDataBase().execSQL("DELETE FROM login");
}
@Override
public void onCreate() {
super.onCreate();
try {
mRetrofit = new Retrofit.Builder()
.baseUrl(AppConstance.APP_URL)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.client(getOkHttpClient())
.build();
Iservice = mRetrofit.create(IdeaService.class);
MultiDex.install(this);
DatabaseHelper dbHelper = new DatabaseHelper(this);
dbase = dbHelper.getWritableDatabase();
AppDataService appDataService = new AppDataService();
loinResponce = appDataService.getLoginDetails();
settingModel = appDataService.getSettings();
FILE_PATH = getAppFilePath();
startService(new Intent(Idea.this, LocationTracker.class));
} catch (Exception e) {
e.printStackTrace();
}
}
public String combineFilePath(String path1, String path2) {
File file1 = new File(path1);
File file2 = new File(file1, path2);
return file2.getPath();
}
public String getAppFilePath() {
String dsPath;
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED))
dsPath = combineFilePath(Environment
.getExternalStorageDirectory().getAbsolutePath(),
"android/data/Idea/");
else
dsPath = this.getDir(
this.getPackageName(), 0).getAbsolutePath();
new File(dsPath).mkdirs();
return dsPath;
}
private OkHttpClient getOkHttpClient() {
try {
// Create a trust manager that does not validate certificate chains
final TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new java.security.cert.X509Certificate[]{};
}
}
};
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(sslSocketFactory);
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
OkHttpClient okHttpClient = builder.build();
return okHttpClient;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
这个错误会因为MultiDexApplication而出现。我在其他一些库中遇到过这种问题,不是同一个库,而是其他一些库。它会错误的改型库,因为它的应用程序启动的初始化在dex(其中你的改型库代码被转换为dex)文件不是要设置(安装)的地方。
为了解决您需要处理多个Dex文件的问题。借助applicationbuild.gradle
&应用程序类
以下更改是build.gradle
文件中需要的
dexOptions {
incremental true
// here heap size give 4g i got this thing from https://groups.google.com/forum/#!topic/adt-dev/P_TLBTyFWVY
javaMaxHeapSize "4g"
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
// your dependencies which you are using.
}
整个build.gradle
android {
signingConfigs {
/*
releasebuild {
keyAlias 'hellotest'
keyPassword 'hellotest'
storeFile file('path to keystore')
storePassword 'hellotest'
}
*/
}
compileSdkVersion 'Google Inc.:Google APIs:22'
buildToolsVersion '23.0.0'
/* if you got error regarding duplicate file of META-INF/LICENSE.txt from jar file
packagingOptions {
exclude 'META-INF/LICENSE.txt'
}
*/
dexOptions {
jumboMode = true
incremental true
// here heap size give 4g i got this thing from https://groups.google.com/forum/#!topic/adt-dev/P_TLBTyFWVY
javaMaxHeapSize "4g"
}
defaultConfig {
multiDexEnabled true
applicationId "com.myapp.packagenme"
minSdkVersion 17
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.releasebuild
}
debug {
signingConfig signingConfigs.releasebuild
}
}
}
dependencies {
compile 'com.android.support:multidex:1.0.1'
// your dependencies which you are using.
}
如果应用程序使用extends the Applicationclass,则可以重写attachbaseContext()
方法并调用multidex.install(this)
来启用multidex。使用Applicaiton类安装multipledex文件上下文,该类应扩展[MultiDexApplication][2]
public class MyAppClass extends MultiDexApplication{
@Override
protected void attachBaseContext(Context newBase) {
MultiDex.install(newBase);
super.attachBaseContext(newBase);
}
}
建议
不要使用整个google play服务,只使用必需的库。从6.5版本开始,你可以选择性地将google play服务API编译到你的应用程序中。例如,要只包含Google Fit和Android Wear API,请替换build.gradle文件中的以下行:
compile 'com.google.android.gms:play-services:8.4.0'
下面这些台词:
compile 'com.google.android.gms:play-services-fitness:8.4.0'
compile 'com.google.android.gms:play-services-wearable:8.4.0'
参考我的答案https://stackoverflow.com/a/34948154/1140237
问题内容: 我在(版本3.1)中使用。当我尝试编译下一行代码 使用maven-compiler-plugin(版本3.3),我收到编译失败消息: 我使用Java 1.7.0_55进行编译。 我该如何解决? 问题答案: 发生问题是因为方法的签名具有可变参数。调用方法时,将分三个阶段搜索所有适用的方法。在阶段3中搜索具有可变参数的方法,在该阶段中,可以进行装箱和拆箱。 因此和都适用于此处,因为考虑了装
问题内容: 我正在使用Android Google Map utils启用标记的群集。我正在用10 当我按下按钮时,我会呼叫: 我的八个标记靠近给定区域,因此它们聚集在一起,我可以看到一个蓝色的球,其中心有数字八。其他两个标记远离另一组,但实际上彼此接近。 我现在看到的是一个带有八个标记的群集,而远处只有一个标记。仅当我放大单个标记(实际上是两个)的区域时,我才能看到两个标记。 我想显示八个标记的
问题内容: 我正在尝试使用chromedriver 2.10在CentOS计算机上的Chrome浏览器35.0.1916.114版上运行测试 /home/varunm/EC_WTF_0.4.10/EC_WTF0.4.10_Project/wtframework/wtf/drivers/chromedriver 实际上,我修复了路径问题,因为如果问题出在路径上,则错误消息有所不同 如果路径错误,我将
问题内容: 当我运行“离子启动项目名称”时,总是收到以下错误消息: 错误信息 问题答案: 尝试再次删除并重新安装节点。这应该工作。 在带有Homebrew的 MacOS上:
我使用以下方法计算行数 和列中的条目 这两种方法在模拟器上都可以正常工作,但在真实设备上会出错...... 知道哪里出问题了吗?谢谢你。 我得到一个错误日志:-
嗨,我最近才开始使用room数据库,我正在看的课程建议使用一个utils/helper类来完成所有的数据库操作,但我从来没有被教过如何将所有的utils静态方法转换为异步任务,以便在room数据库中正确使用,所以我想知道是否有人对如何实现这一点有建议。干杯 (下面是我正在使用的实用程序和mainFragment Utils类 null null
问题内容: 检查数组arr1是否包含与arr2相同的元素,并且在Java中的顺序相同。 例如: 到目前为止,我有 问题在于它只比较两个数组的第一个元素。 问题答案: 您正在迭代直到找到匹配项。相反,您应该寻找不匹配的字符串,并且应该使用 not 仅供参考,这也是Arrays.equals在处理值时所做的事情。
[source] CustomObjectScope keras.utils.CustomObjectScope() 提供更改为 _GLOBAL_CUSTOM_OBJECTS 无法转义的范围。 with 语句中的代码将能够通过名称访问自定义对象。 对全局自定义对象的更改会在封闭的 with 语句中持续存在。 在with语句结束时, 全局自定义对象将恢复到 with 语句开始时的状态。 示例 考虑