1.ListView 中图片错位的问题是如何产生的?
首先上图
图片错位原理:
如果我们只是简单显示list中数据,而没用convertview的复用机制和异步操作,就不会产生图片错位;重用convertview但没用异步,也不会有错位现象。但我们的项目中list一般都会用,不然会很卡。
在上图中,我们能看到listview中整屏刚好显示7个item,当向下滑动时,显示出item8,而item8是重用的item1,如果此时异步网络请求item8的图片,比item1的图片慢,那么item8就会显示item1的image。当item8下载完成,此时用户向上滑显示item1时,又复用了item8的image,这样就导致了图片错位现象(item1和item8是用的同一块内存哦)。
解决方法:
对imageview设置tag,并预设一张图片。
向下滑动后,item8显示,item1隐藏。但由于item1是第一次进来就显示,所以一般情况下,item1都会比item8先下载完,但由于此时可见的it
// 给 ImageView 设置一个 tag
holder.img.setTag(imgUrl);
// 预设一个图片
holder.img.setImageResource(R.drawable.ic_launcher);
// 通过 tag 来防止图片错位
if (imageView.getTag() != null && imageView.getTag().equals(imageUrl)) {
imageView.setImageBitmap(result);
}
2.Android中Java和JavaScript交互
实现交互步骤:
- WebView开启JavaScript脚本执行
- WebView设置供JavaScript调用的交互接口。
- 客户端和网页端编写调用对方的代码。
js调用Java
格式为:window.jsInterfaceName.methodName(parameterValues)
Java(webView)调用JS
格式为:webView.loadUrl(“javascript:methodName(parameterValues)”)
3 服务器只提供数据接收接口,在多线程或多进程条件下,如何保证数据的有序到达?
1,有序 多线程要使用同步,多进程要使用进程通信保障数据传输的顺序
2,到达 使用tcp可靠传输,服务器返回传输成功后才能传输下一个
要在传输的包中加入,顺序标识
4.ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化?
我们可不可以设置ViewPager的预加载为0,不能解决问题
vp.setOffscreenPageLimit(0);
关键在于setUserVisibleHint(boolean isVisibleToUser)方法
5.点击事件被拦截,但是想传到下面的View,如何操作?
重写子类的requestDisallowInterceptTouchEvent()方法返回true就不会执行父类的onInterceptTouchEvent(),即可将点击事件传到下面的View
6.Bitmap的recycler()
尽快的调用recycle是个好习惯,会释放与其相关的native分配的内存;但一般情况下其图像数据是在JVM里分配的,调用recycle并不会释放这部分内存。
我们用createBitmap创建的Bitmap且没有被硬件加速Canvas draw过,则主动调用recycle产生的意义比较小,仅释放了native里的SkPixelRef的内存,这种情况我觉得可以不主动调用recycle。
被硬件加速Canvas draw过的由于有TextureCache应该尽快调用recycle来尽早释放其TextureCache。
像截屏这种不是在JVM里分配内存的情况也应该尽快调用recycle来马上释放其图像数据。
(一个例外,如果是通过Resources.getDrawable得到的Bitmap,不应该调用recycle,因为它可能会被重用)