Android屌屌的东西Android 解bug方法

Android开发中的BUG列表

2016-01-04  本文已影响2988人  Diffey

1.java.lang.NoSuchMethodError: android.content.res.Resources.getDrawable
或者 java.lang.NoSuchMethodError:android.content.Context.getDrawable

原因:Context类的getDrawable(res)方法和Resources的getDrawable(res,theme)都是API21才添加的,低版本系统无法找到该方法所以报异常。

解决办法:
使用Resources的getDrawable(res),但是该方法在API22已废弃。
使用ContextCompat.getDrawable(context,res)。

2.java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread.

原因:该异常在ListView的layoutChildren()方法中抛出,代码如下:
<code>
if (mItemCount == 0) {
resetList();
invokeOnItemScrollListener();
return;
} else if (mItemCount != mAdapter.getCount()) {
throw new IllegalStateException("The content of the adapter has changed but " + "ListView did not receive a notification. Make sure the content of " + "your adapter is not modified from a background thread, but only from " + "the UI thread. Make sure your adapter calls notifyDataSetChanged() " + "when its content changes. [in ListView(" + getId() + ", " + getClass() + ") with Adapter(" + mAdapter.getClass() + ")]");
}
</code>
即当Adapter的数据改变时,却未及时通知到ListView就会抛出这个异常。一种是Adapter的数据改变了却没有调用notifyDataSetChanged(),一种是改变Adapter数据在其它线程,调用notifyDataSetChanged()在主线程,之间有延迟。

解决办法:
确保改变数据完立即通知ListView。
如果Adapter的数据处理在其它线程,那就让Adapter持有一份数据,其它线程处理完数据后用Handler发通知,在UI线程中改变Adapter的数据和通知ListView。

3.UnsupportedMethodException
Unsupported method:InstantRun.getRestartDexFile().The version of Gradle you connect to does not support that method.

原因:Android Studio的版本和Gradle版本不兼容。
解决办法:升级AS或者更改Gradle的版本。

4.java.lang.NoSuchMethodError: android.graphics.drawable.Drawable.getAlpha

原因:Drawable.getAlpha是API 19才添加的。
Drawable.setAlpha是API 1就可以用,这种不对称真是坑啊。
注意View.setAlpha和View.getAlpha都是API 11添加的。

上一篇下一篇

猜你喜欢

热点阅读