Android错误知识汇总

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

解决方法:在gradle文件中改,只需要将重复的引用中的compile改成provided就行。
Android错误知识汇总_第1张图片


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就行。
Android错误知识汇总_第2张图片


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

//2、设置透明Theme


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. 最终解决方案

最后发现,只需修改一下上述步骤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 mActivity;
        public MyHandler(SplashActivity activity){
            mActivity=new WeakReference(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

  1. 安装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错误和异常】)