您的位置:首页 > 移动开发 > Android开发

Android错误知识汇总

2017-02-20 22:02 465 查看

1.Android Studio com.android.dex.DexException: Multiple dex files define(重复引用包)

解决方法:在gradle文件中改,只需要将重复的引用中的compile改成provided就行。



2.AS中运行项目时出现Error: Execution failed for task ‘:app:transformClassesWithDexForDebug’…

解决方法:重新clean project

3.Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’. com.Android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘F:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe” finished with non-zero exit value 1

解决方法:这个是因为依赖包重复了 ,只需要将其中一个重复引用的依赖去掉就行了,如:

compile('com.android.support:appcompat-v7:23.+') {
exclude module: 'support-v4'
}


4.Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’. com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘F:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe” finished withnon-zero exit value 2

解决方法:

这个错误在app的build.gradle里面添加下面这句就好了。

android {

defaultConfig {
...
multiDexEnabled true
}

}


5.Android Studio com.android.dex.DexException: Multiple dex files define(重复引用包)

解决方法:在gradle文件中改,只需要将重复的引用中的compile改成provided就行。



6.AS中运行项目时出现Error: Execution failed for task ‘:app:transformClassesWithDexForDebug’…

解决方法:重新clean project

7.Error:Execution failed for task ‘:app:transformClassesWithDexForDebug’. com.Android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘F:\Program Files (x86)\Java\jdk1.8.0_31\bin\java.exe” finished with non-zero exit value 1

解决方法:这个是因为依赖包重复了 ,只需要将其中一个重复引用的依赖去掉就行了,如:

compile('com.android.support:appcompat-v7:23.+') {
exclude module: 'support-v4'
}


8. java.lang.NoSuchMethodError: No static method setOnApplyWindowInsetsListener(Landroid/view/View;Landroid/support/v4/view/OnApplyWindowInsetsListener;)V in class Landroid/support/v4/view/ViewCompatLollipop; or its super classes (declaration of ‘android.support.v4.view.ViewCompatLollipop’ appears in /data/data/cniao5.com.cniao5shop/files/instant-run/dex/slice-internal_impl-24.2.1_2eab930133e1b5ce89e8f97bd2247bca5bd1b530-classes.dex)

解决方法:

使用最新的compileSdkVersion、buildToolsVersion即可

9.Error:(7, 33) 错误: 找不到符号 符号: 类 TintTypedArray 位置: 程序包 android.support.v7.widget

解决方法:在sdk23时,TintTypedArray是在android.support.v7.internal.widget.TintTypedArray包下的,在sdk25时,变成了 android.support.v7.widget.TintTypedArray

10. okhttp异常: java.lang.IllegalStateException: closed

java.lang.IllegalStateException: closed
at okhttp3.internal.http.Http1xStream$FixedLengthSource.read(Http1xStream.java:378)
at okio.Buffer.writeAll(Buffer.java:993)
at okio.RealBufferedSource.readByteArray(RealBufferedSource.java:106)
at okhttp3.ResponseBody.bytes(ResponseBody.java:128)
at okhttp3.ResponseBody.string(ResponseBody.java:154)
at com.gjg.fjdshop.ui.home.fragment.HomeFragment$4.onResponse(HomeFragment.java:121)
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133)
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)


解决方法:

这个错误是由于response.body().string()调用了多次导致的,string()仅可调用一次。

11. 解决app启动时的白屏问题

其实,黑屏或者白屏这里并不是不正常,而是还没加载到布局文件,就已经显示了window窗口背景,黑屏白屏就是window窗口背景。

//1、设置背景图Theme

<style name="Theme.AppStartLoad" parent="android:Theme">
<item name="android:windowBackground">@drawable/ipod_bg</item>
<item name="android:windowNoTitle">true</item>
</style>


//2、设置透明Theme

<style name="Theme.AppStartLoadTranslucent" parent="android:Theme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowNoTitle">true</item>
</style>


12. 防止app一进入页面时就弹出软键盘

//隐藏软键盘
getActivity().getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);


注意:需要放在联网请求数据之前

13.butterknife在library中的使用问题

创建一个新的library,需要使用到butterknife,但是使用@bind时,一直不会显示到对应资源文件的id,而显示 R.id.class。

原因:因为在library里R.id.xxx不再是final类型了,也就不是常量了变成可变的,而注入是需要传入常量

butterknife当前版本是8.4.0,已经提供了对library project的支持,github主页的使用步骤总结一下就是:

1.To use Butter Knife in a library, add the plugin to your buildscript:

buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
}
}


2.and then apply it in your module:

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'

dependencies {
compile 'com.jakewharton:butterknife:8.4.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
}


3.Now make sure you use R2 instead of R inside all Butter Knife annotations.

class ExampleActivity extends Activity {
@BindView(R2.id.user) EditText username;
@BindView(R2.id.pass) EditText password;
}


但是按照这个步骤操作后并没有效果,用@BindView的地方提示NullPointerException,用@onClick的标注的点击事件,点击后也没有反应

最终解决方案

最后发现,只需修改一下上述步骤1和2就可以了。

步骤1加上依赖注入的plugin:

buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' // 添加的部分
classpath 'com.jakewharton:butterknife-gradle-plugin:8.4.0'
}

}


然后步骤2也修改一下:

apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
apply plugin: 'android-apt'

dependencies {
compile 'com.jakewharton:butterknife:8.4.0'
apt 'com.jakewharton:butterknife-compiler:8.4.0' // 修改的地方 把annotationProcessor改为apt
}


这样处理之后,就正常了!

14.Handler的正确用法

下面的用法可以消除黄色警告,消除内存泄露。

private MyHandler handler = new MyHandler(this);

static class MyHandler extends Handler{

private final WeakReference<SplashActivity> mActivity;
public MyHandler(SplashActivity activity){
mActivity=new WeakReference<SplashActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
//若activity退出就不处理消息
if(mActivity.get()==null){
return;
}else{
SplashActivity splashActivity=mActivity.get();
if (splashActivity.isFinishing()) {
return;
}

// 判断进入主页面还是登录页面
splashActivity.goMainOrLogin();

}

}
}


15.使用FragmentTabHost layout doesn’t render

java.lang.IllegalStateException: No tab known for tag null
at android.support.v4.app.FragmentTabHost.doTabChanged(FragmentTabHost.java:334)
at android.support.v4.app.FragmentTabHost.onAttachedToWindow(FragmentTabHost.java:280)
......


http://stackoverflow.com/questions/14370745/fragmenttabhost-graphical-layout-doesnt-render

FragmentTabHost will not show any content as the content will be added dynamically. So no issues their. Should work when u add the tabs in the code and test it. androidhive.info/2011/08/android-tab-layout-tutorial – mipreamble Jul 9 at 12:21

16.如何在 ScrollView 中如何嵌入 ListView

在 ScrollView 添加一个 ListView 会导致 listview 控件显示不全,通常只会显示一条,这是因为两个控件的滚动事件冲突导致。所以需要通过 listview 中的 item 数量去计算 listview 的显示高度,从而使其完整展示,如下提供一个方法供大家参考。

1、在计算listview总高度并设置

ListView listView = (ListView) findViewById(id);

YourAdapter adapter = new MyAdapter(“初始化你的适配器”);

listView.setAdapter(adapter);

setListViewHeightBasedOnChildren(listView);(在setAdapter后调用自定义的方法)

/**
* @param listView
*/
private void setListViewHeightBasedOnChildren(ListView listView) {

ListAdapter listAdapter = listView.getAdapter();
if (listAdapter == null) {
return;
}

int totalHeight = 0;
for (int i = 0; i < listAdapter.getCount(); i++) {
View listItem = listAdapter.getView(i, null, listView);
listItem.measure(0, 0);
totalHeight += listItem.getMeasuredHeight();
}

ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
listView.setLayoutParams(params);
}


使用该方法需要注意:子ListView的每个Item必须是LinearLayout,不能是其他的,因为其他的Layout(如RelativeLayout)没有重写onMeasure(),所以会在onMeasure()时抛出异常。

注意:如果直接将 ListView 放到 ScrollView 中,那么上面的代码依然是没有效果的.必须将 ListVIew 放到

LinearLayout 等其他容器中才行.

2、 自定义ListView,重载onMeasure()方法,设置全部显示

public class ScrollViewWithListView extends ListView {

public ScrollViewWithListView(android.content.Context context,android.util.AttributeSet attrs) {
super(context, attrs);
}

/**
* Integer.MAX_VALUE >> 2,如果不设置,系统默认设置是显示两条
*/
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,        MeasureSpec.AT_MOST);
super.onMeasure(widthMeasureSpec, expandSpec);

}

}


以上可以解决scrollView内嵌listView,但是有一个问题是第一次进入界面时动态加载listview的items后页面会跳转到listview的第一个子项,这很蛋疼,

无奈又不知道怎么解决,就先用

scrollView.post(new Runnable() {
//让scrollview跳转到顶部,必须放在runnable()方法中
@Override
public void run() {
scrollView.scrollTo(0, 0);
}
});


17.Error:Execution failed for task ‘:app:processDebugManifest’. Manifest merger failed with multiple errors, see logs

网上的解决方法:

方法1

第一步:

在Manifest.xml的application标签下添加tools:replace=”Android:icon, android:theme”(多个属性用,隔开,并且记住在manifest根标签上加入xmlns:tools=”http://schemas.android.com/tools”)

你肯定说,不都一样嘛,但是你的错误是不是还在,还在那么,我们继续往下走:

第二步:不用看了,问题百分之百,在你的builde.gradle的位置

minSdkVersion 16

targetSdkVersion 23

你看清楚,你的这个值和你要依赖的那个包,是不是builde.gradle不一样。

改完就OK了。

方法2:在build.gradle根标签上加上useOldManifestMerger true (懒人方法)

但是,我的错误并不是这个造成的,我的错误原因是将

android:allowBackup="true"


设置成了

android:allowBackup="false"


将其改回来即可。

18. adb install xxx.apk 报错,安装APK报错:INSTALL_FAILED_SHARED_USER_INCOMPATIBLE

安装APK报错:Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE],表示APK需要没有签名或者签名不符合系统签名。

解决方法:使用源码下的 build/target/product/security/ 下的platform.x509.pem 和 platform.pk8(注意这里如MTK源码中需要使用对应build/target/product/security/项目/下的这两个工具),以及源码下的out/host/Linux-x86/framework/(这个为编译源码后的目录)下的signapk.jar,共三个工具进行签名。

签名方法:将上述三个apk拷贝到同一个目录下,使用” Java -jar signapk.jar platform.x509.pem platform.pk8 待签名名字.apk 签名后名字.apk “命令进行签名。

然后安装即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 错误