Android 开发中一些常见的Bug问题及其解决方案

 

(1)
1.android.os.NetworkOnMainThreadException  网络操作在主线程异常
android2.3以后所有访问网络/耗时的操作必须放在子线程中,不能放在主线程;
2.3之前可以在主线程,但是耗时的操作会是应用发生ANR(application not response)应用程序无响应


2.java.lang.SecurityException: Permission denied (missing INTERNET permission?)
安全的异常:权限拒绝:INTERNET


3.android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views
original thread主线程...子线程不能更新UI


4. java.lang.SecurityException: ConnectivityService: Neither user 10040 nor current process has android.permission.ACCESS_NETWORK_STATE
如果需要获取网络的状态,需要添加权限android.permission.ACCESS_NETWORK_STATE


(2) HttpClient
1.org.apache.http.conn.HttpHostConnectException: Connection to http://192.168.43.146:8080 refused
Caused by: java.net.SocketException: socket failed: EACCES (Permission denied)....权限


2.Caused by:java.lang.IllegalStateException: Cannot execute task:the task has already been executed (a task can be executed only once)
同一个异步任务只能执行一次,执行多次会报错


(3)

1.//建立异步任务
          AsyncTask<Void, String, Void> task = new AsyncTask<Void, String, Void>() {
               @Override
               protected Void doInBackground(Void... voids) {
                try {
                    //获取输入的IP地址
                    String ip = edit_ip.getText().toString();  


    //edit_ip.getText().toString();    报错:Method getText must be called from the UI thread, currently inferred thread is worker 。
             在Studio中需把EditText输入内容( edit_ip.getText().toString(); )抽取成一个变量,不能像在Eclipse中连接显示 


                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;

 

            }

 


(4)


SSLException异常:证书不匹配的主机名 的问题:org.apache.http有自己的一套SSL东西,修改org.apache.http的主机名验证解决问题


System.err: javax.net.ssl.SSLException: hostname in certificate didn't match: <api.tianapi.com> != <*.sinaapp.com> OR <*.sinaapp.com> OR <sinaapp.com>

解决方法:加一行代码   SSLSocketFactory.getSocketFactory().setHostnameVerifier(new AllowAllHostnameVerifier());


(5)

ClassCastException:类型强制转换类型


System.err: java.lang.ClassCastException: com.android.okhttp.internal.http.HttpURLConnectionImpl cannot be cast to javax.net.ssl.HttpsURLConnection



错误原因是:请求网络数据是使用的Http协议,报错是因为使用了Https协议,所以会导致空指针错误。

解决方法:把 HttpsURLConnection 类更正为 HttpURLConnection 进行请求数据。




(6)


does not match path   路径不匹配


(7)


1. Caused by: java.lang.ArithmeticException: divide by zero   


               ArithmeticException  算数计算异常

       divide by zero   被零除错误,除以零错误,就是除数不能为0


2. Caused by: java.lang.reflect.InvocationTargetException


       reflect   反射


       InvocationTargetException异常由Method.invoke(obj, args...)方法抛出。当被调用的方法的内部抛出了异常而没有被捕获时,将由此异常接收。


(8)


com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 67


错误原因:提示大概的意思就是,期望是BEGIN_ARRAY,但是是STRING。本来是一个对象的数组,但是我这里确是"",空字符串,所以导致出现了问题。


总结:(1)碰到这个问题的时候,比较郁闷,使用HiJson等解析工具没有报错。但是实际代码中总是报错。


              (2)服务器端的数据类型应该定义严谨一些,要不然很容易出现错误。


(9)

android Toast提示异常:java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

错误原因:原来是在子线程弹Toast了,切记,Toast只能在UI线程弹出,如果一定要在子线程弹,那么就通过 new Handler(Looper.getMainLooper()) 来弹出。

如下代码:

private void toastTest() {  

      new Thread(new Runnable() {  
  
@Override  
public void run() {  
    Handler handler = new Handler(Looper.getMainLooper());


//handler内为UI线程
    handler.post(new Runnable() {  
          
        @Override  
        public void run() {  
            //放在UI线程弹Toast  
            Toast.makeText(MainActivity.this, "toast in work thread", Toast.LENGTH_LONG).show();  
        }  
        });  
   
//此处子线程弹Toast会发生异常  
            Toast.makeText(MainActivity.this, "toast in work thread", Toast.LENGTH_LONG).show();  


   }).start();  
  }  


(10)
      Android Studio 3.0预览版本 Error:Gradle: failed to create directory 解决方案:


            在项目的 gradle.properties 中添加   android.enableAapt2=false     即可

(11)


      错误:Caused by: org.greenrobot.eventbus.EventBusException: Subscriber class com.dhw.eventbus_lianxi.MainActivity and its super classes have no public methods with the @Subscribe annotation


      解决方案:在onEventMainThread()方法上加注解“@Subscribe”;


(12 )
      错误:java.lang.IllegalArgumentException: Unable to create converter for class

      错误: android.database.sqlite.SQLiteException: no such table: USER (code 1): , while compiling: INSERT INT


      解决:

       1.一般这种错误出现的原因常见的是由于没有使用数据库中的表的时候把表名写错了,导致表名与创建的表的名称不同而出错。
解决办法:
仔细检查表名,把表名写正确,与所创建的表名一致。
 
2.另一种原因可能是编译器导致的原因,我遇到过一次。情况是仔细检查了数据库中表的创建与表的使用过程中都没有出错,但是还是会出现这种错误。
 
这种情况的解决办法 :简单来说,就是卸载当前应用,重新安装运行。
把该程序在bin文件夹中所产生的APK删除(如果程序在手机上运行,那么也把在手机上产生的该程序的APK也删除掉。简而言之,就是把运行该程序所产生的APK都删除掉!),然后再

运行一次编译器,让它新产生一个该程序的APK

(13)

      错误:Caused by:android.database.sqlite.SQLiteException: 
 
            duplicate column name: _ID (code 1): , while compiling: CREATE TABLE "RESULTS_BEAN" ("_id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,"_ID" TEXT);


      原因:新建的表id属性列名与返回的数据列名id重复,需要修改一个。
   
      解决:在新建的表id属性列名上面加上   @Property(nameInDb = "www")     //此注解意为,修改@Property注解下的属性在数据库中的列名


(14)


      错误:  java.lang.IllegalArgumentException: @FieldMap parameters can only be used with form encoding. (parameter #1)

      原因:  非法参数异常:使用@FieldMap注解传递参数时,只能用于表单编码参数。

      解决:  需要在@Post注解上面加上编码注解:@FormUrlEncoded



(15)


      错误 1: Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
      > java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex


      原因:  当工程中依赖的不同版本的同一个依赖库,重复依赖的库都是通过 gradle 网络依赖方式,那么 AS 会默认选择高版本。但是如果既有本地依赖版本,又有网络依赖版本,结
              果就是引起重复依赖冲突。

      解决:  如下依赖版本换为 + ,表示最新版本:

    implementation 'com.android.support:appcompat-v7:27.+'
    implementation 'com.android.support:design:27.+'

    implementation 'com.android.support:recyclerview-v7:27.+'


     错误 2:Error:Execution failed for task ':XiangQing_TwoShopCart:preDebugAndroidTestBuild'.
     > Conflict with dependency 'com.android.support:support-annotations' in project ':XiangQing_TwoShopCart'. Resolved versions for app (26.1.0) and test app (27.1.1) differ. See https://d.android.com/r/tools/test-apk-dependency-conflicts.html for details.

     
     原因: Studio版本version低,导致SDK配置和依赖dependency 冲突. 发生这类型的错误,是当我们修改了.build中的compileSdkVersion,产生所依赖的dependency与当前版本不一致导致的。

     解决方法 1(不支持): (1)把 dependencies {  
 
 implementation 'com.android.support:appcompat-v7:26.1.0'  改→→为:  implementation 'com.android.support:appcompat-v7:27.1.1'    
   }


    (2) android {
        compileSdkVersion 26    改→→为: compileSdkVersion 27


    (3)defaultConfig {
  
                targetSdkVersion 26    改→→为:targetSdkVersion 27

     解决方法 2(比较好): build->Rebuid-project

 

 

 

 


(16)
  
     错误:Installation failed with message Invalid File: D:\Studio\app\build\intermediates\split-apk\debug\slices\slice_3.apk.
              It is possible that this issue is resolved by uninstalling an existing version of the apk if it is present, and then re-installing.


     原因:APP的APK文件安装失败,原来的apk文件版本存在问题,无法安装

     解决:删除要安装的APP的build文件夹,对,直接删,然后重新编译,就可以安装成功

 

 

 

 

 

(17)
   
     错误:Binary XML file line #0: Error inflating class android.support.v7.widget.ActionBarContextView

     原因:v7 包下的 AppCompatActivity 与 使用的依赖冲突

     解决:把 AppCompatActivity  改为  Activity 



(18)

    错误:java.lang.IllegalStateException: ScrollView can host only one direct child

    翻译:ScrollView内部只能持有一个直接的子元素

    顾名思义,错误出现的原因即是ScrollView中有多个元素

    解决办法:把所有的子元素放到一个LinearLayout内部或RelativeLayout等其他布局方式后,再在这个layout外部用scrollview包住。(参考:    https://blog.csdn.net/liranke/article/details/42058479)



(19) //解决ScrollView中嵌入一个或多个RecyclerView页面滑动卡顿
         mMajorLv.setHasFixedSize(true);
         mMajorLv.setNestedScrollingEnabled(false);

         xrecyleview上拉加载的时候比较迟钝的解决:  → 布局加入:  android:nestedScrollingEnabled="false"



(20) Error:Execution failed for task ':clean'. > Unable to delete directory :\build\intermediates (转)

第一种方法:
删除app下的build文件夹,可以使用360文件粉碎机删除,然后重启Android Studio,重新编译即可!



第二种方法:
        进入studio,进入settings,搜索instant run,进入该界面,有四个选项,第一个默认是打勾的,去其去掉就可以了。


(21)  Android Error:Execution failed for task ':app:compileDebugJavaWithJavac' 解决方案

        参考博客:https://blog.csdn.net/u014453811/article/details/54582426


(22)  Android MultiDex 解决 64K 限制,方法数超过65535解决方法

        参考博客:https://blog.csdn.net/fan7983377/article/details/73850282 (给App启用MultiDex功能)




(23)  Android 混淆报错app:transformClassesAndResourcesWithProguardForRelease

            新项目打包的时候,一直报app:transformClassesAndResourcesWithProguardForRelease,
 

          解决方法:在混淆配置文件 proguard-rules.pro 里加上   -ignorewarnings   这句话的作用是屏蔽警告,最后就能顺利打包。

 

(24)  android.view.InflateException: <merge /> must be the root element

        错误原因:merge标签不能应用于viewstub标签之下。

        /**
         * 使用ViewStub的一些注意点:

           ViewStub中的layout布局不能使用merge标签,否则会报错;

           ViewStub的inflate只能执行一次,显示了之后,就不能再使用ViewStub控制它了。
         */

 

(25)  Could not download junit.jar (junit:junit:4.12) 错误 --- 常见于初次安装 Studio时!

    解决:参考: https://blog.csdn.net/u010853130/article/details/71244396

    把压缩包文件解压在 C:\Users\Administrator\.gradle\wrapper\dists\gradle-4.1-all\bzyivzo6n839fup2jbap0tjew  路径下,然后再Studio中重新编译

          
    gradle 下载地址:

    services.gradle.org/distributions/gradle-4.1-all.zip 

    services.gradle.org/distributions/gradle-4.2-all.zip 


(26)  Android Studio 无法下载插件 

    解决方法: File->Settings->Apparence & Behavior->System Settings->Updates->use secure connnection 勾去掉

 

 

 

 

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值