• Android 异常解决方法【汇总】


    (1)异常:Android中引入第三方Jar包的方法(Java.lang.NoClassDefFoundError解决办法)

    1、在工程下新建lib文件夹,将需要的第三方包拷贝进来。
    2、将引用的第三方包,添加进工作的build path。选中jar包->Build Path
    3、(关键的一步)将lib设为源文件夹。如果不设置,则程序编译可以通过,但运行的时候,会报:选中lib文件夹->source code
    java.lang.NoClassDefFoundError
     
    (2)异常:Caused by: android.os.TransactionTooLargeException
    导致原因是:Binder传输的数据太大
    如果Binder的参数或返回值太大,不适合的事务缓冲区,然后调用将失败,并将被抛出TransactionTooLargeException。
    解决方法:
    不要将大量数据传入Binder
     
    (3)异常:android.database.CursorWindowAllocationException:Cursor window allocation of 2048 kb failed
    导致原因:主要原因是因为使用了SimpleCursorAdapter类,其中的Cursor参数需要我们手动关闭,否则就会出现以上异常。
    解决方法:cursor.close()
     
    (4)异常:Excessive JNI global references错误的解决方案  GREF暴增
    导致原因:vm对jni层的reference有个数限制,过多很造成VM aborting。因此每次在GREF增加到2000以上的时候就直接aborting了
     解决方法:及时回收或关闭引用
     
     
    (5)异常:android.view.WindowManager$BadTokenException: Unable to add window -- token 
    导致原因:使用getApplicationContext()获得的Context,而必须使用Activity,因为只有一个Activity才能添加一个窗体。
    解决方法:采用当前Activity的Context
     
    (6)异常:android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
    导致原因:重复安装软件,导致Sqlite3打开数据库异常
    解决方法:卸载相应软件,开关机,重新安装该软件,即可以解决相关异常。
     
     (7)异常:java.lang.NullPointerException
     异常原因:使用fragment时,fragment相关布局,必须给每个view设置id,否则通过activity获得fragment的实例时会出现以上异常
    解决方法:为fragment布局的每个view设置ID
     
    (8)异常:java.util.ConcurrentModificationException(并发操作异常)
     异常原因:ArrayList是非线程安全的,当同时在遍历和修改ArrayList时,就会出现该异常
    解决方法:使用Vector替换ArrayList,Vector是线程安全的。Vector的缺点:大量数据操作时,由于线程安全,性能比ArrayList低
     (9)异常:so库文件异常(JNI层异常)
     异常原因:在Android应用层开发中,我们经常会使用so库文件。当so库文件发生异常时,我们只能在adb log中发现fatal libc这样的异常信息,仅此而已,并不能发现异常调用的逻辑关系, 这是我们就需要查看so 库异常Log信息。在Android手机的/data/tombstones 的路径下就包含了so库文件发生异常的Log信息,开发者可以查看该路径下载Log文件发现异常调用的逻辑关系。
     
    deadObjectException异常,说明应用的service已经停止,要么是从操作系统中丧生,要么从应用程序中终止。

    (11)java.lang.IllegalStateException: commit already called

    这个错误是我学习最基础的fragment的错误。

    注意原因就是:

         因为你的FragmentTransaction事务是全局的变量,所以只能commit一次。

    所以我们要两个局部FragmentTransaction事务去做commit即可。

    做一下笔记,希望下次有小伙伴遇到这样的可以帮忙解决。

     

    APP全局异常捕获,并保存本地文件  http://www.cnblogs.com/androidsj/p/4851338.html

    安卓5.0正常运行,5.0以下NoClassDefFoundError

    http://blog.csdn.net/run_forrest_run/article/details/51939957

    //  解决方法就是在项目的Application类中加入了以下代码:
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base); MultiDex.install(this);
    }

    AAPT err(Facade for 157667509): libpng error: Not a PNG file

    错误,提示信息显示图片非PNG格式。
    解决方法:
    在studio中依次点开每个后缀名为png的图片,
    即使图片的后缀名是png,这里会显示真正的格式。找到不符合要求的图片,另存为png格式即可。

    Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

    当在AndroidManifest.xml文件的application的节点设置了属性:

    android:theme="@android:style/Theme.NoTitleBar

    而Activity继承了ActionBarActivity就回出现上述错误,解决的办法就是让Activity去继承Activity而不是ActionBarActivity

    ArithmeticException产生该错误的原因是没有对0进行考虑,因为在进行一些算数运算的时候除数是不可为0的,此时就该用条件语句判断一下除数是否为0,否则就会抛出该异常。

    【IllegalArgumentException】此异常表明向方法传递了一个不合法或不正确的参数。 看看传值的方法是否参数不正确。 

    java.lang.VerifyError错误jar包的问题,可能是自己不小心拖动了jar包 导致重复了后来再classpath里面添加了个用到的包,删除了多余的jar包。

    android.view.WindowManager$BadTokenExceptionUnable to add window — token null   无法添加窗口

    new AlertDialog.Builder(mcontext)  
                .setIcon(android.R.drawable.ic_dialog_alert)  
                .setTitle("Warnning")  
                .setMessage(  
                        "You forget to write the message. Do you want to fill out it ??")  
                .setPositiveButton("Yes", positiveListener).setNegativeButton(  
                        "No", negativeListener).create().show();  

    导致报这个错是在于new AlertDialog.Builder(mcontext),虽然这里的参数是AlertDialog.Builder(Context context)但我们不能使用getApplicationContext()获得的Context,而必须使用Activity,因为只有一个Activity才能添加一个窗体。

    解决方法:将new AlertDialog.Builder(Context context)中的参数用Activity.this(Activity是你的Activity的名称)来填充就可以正确的创建一个Dialog了。 

    new AlertDialog.Builder(MyActivity.this)  
                    .setIcon(android.R.drawable.ic_dialog_alert)  
                    .setTitle("Warnning")  
                    .setMessage(  
                            "You forget to write the message. Do you want to fill out it ??")  
                    .setPositiveButton("Yes", positiveListener).setNegativeButton(  
                            "No", negativeListener).create().show();  

     【  @TargetApi(Build.VERSION_CODES.HONEYCOMB)  】

    指使用该注解的方法适用于  系统版本  为3.0及以上系统的手机。

    [Android Pro] java.lang.IllegalStateException: Fragment(XXFragment) not attached to Activity异常

    1、关于Fragment(XXFragment) not attached to Activity 异常。出现该异常,是因为Fragment的还没有Attach到Activity时,调用了如getResource()等,需要上下文Content的函数。解决方法,就是等将调用的代码写在OnStart()中。网上还有几处这样的参考:http://stackoverflow.com/questions/10919240/fragment-myfragment-not-attached-to-activity 回答的主要是在调用

     

    之前增加一个判断isAdded(),两外说这个异常解决办法的有http://stackoverflow.com/questions/6870325/android-compatibility-package-fragment-not-attached-to-activity

    这个是针对另外一种情况下的解决方式。

     

    2、在使用Fragment保存参数的时候,可能是因为需要保存的参数比较大或者比较多,这种情况下页会引起异常。比如代码

    Bundle b = new Bundle(); 
    b.putParcelable("bitmap", bitmap2); 
    imageRecognitionFragment.setArguments(b); 
    Bundle b = new Bundle();  
    b.putParcelable("bitmap", bitmap2);  
    imageRecognitionFragment.setArguments(b);  

     

    设置好参数,并且添加hide(),add(),方法之后,需要commit(),来实现两个Fragment跳转的时候,这种情形下参数需要进行系统保存,但是这个时候你已经实现了跳转,系统参数却没有保存。此时就会报
    java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
    异常。分析原因:你并不需要系统保存的参数,只要你自己设置的参数能够传递过去,在另外一个Fragment里能够顺利接受就行了,现在android里提供了另外一种形式的提交方式commitAllowingStateLoss(),从名字上就能看出,这种提交是允许状态值丢失的。到此问题得到完美解决,值的传递是你自己控制的。
    这里也说一下另外一个问题,bitmap 也可以通过Bundle传递的,使用putParacelable就可以了.

    android.view.WindowManager$BadTokenException

              这里主要说的是你的android里一个Activity发生窗体泄漏了,也就是我们常说的内存泄漏,为什么窗体会泄漏,主要是你的打开一个PopupWindow(窗体)时,如图。它没有关闭PopupWindow(窗体),就退出这个Activity,就会发生这个错误,因为这里就有一个顺序,你要先关闭PopupWindow,再关闭Activity,这个一定的,PopupWindow(窗体)不能独立存在。

              明白这个,你就容易解决了,你先用(dismiss)关闭就行,在你的窗体需要关闭时,加上这句:(PopupWindow.dismiss;)PopupWindow这个是你项目里你窗体的名字。最好做一个判断,判断窗体是否为空,如果不为空就关闭,不然有时空也关闭也会出错。

    “NetworkOnMainThreadException”出错提示的原因及解决办法

    在低版本的API上都可以运行的,但在3.0以上的版本就会出现NetworkOnMainThreadException

    出现android.os.NetworkOnMainThreadException错误提示的原因

    原因:不允许在主线程中进行网络访问

    解决办法:将网络访问的操作单独放到一个线程中,代码如下:

    new Thread(){
       @Override
       public void run()
       {
       //把网络访问的代码放在这里   
      }
    }.start();
     

    最常见的八种Android报错及快速解决方法

    http://jingyan.baidu.com/article/1612d5006546d1e20e1eeefa.html



  • 相关阅读:
    [leetcode ]429. N-ary Tree Level Order Traversale (easy)
    [leetcode] 559. Maximum Depth of N-ary Tree (easy)
    [leetcode] 406. Queue Reconstruction by Height (medium)
    [leetcode] 238. Product of Array Except Self (medium)
    [leetcode] 94. Binary Tree Inorder Traversal
    [leetcode] 621. Task Scheduler(medium)
    [leetcode] 309. Best Time to Buy and Sell Stock with Cooldown(medium)
    为窗口设置图标
    关闭住主窗口
    窗口居中显示
  • 原文地址:https://www.cnblogs.com/androidsj/p/4383620.html
Copyright © 2020-2023  润新知