android开发中遇到的技术难题,android开发过程中遇到的问题以及解决办法

####编译的时候遇到的问题:

“android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.”

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.(Handler.java:121) at android.widget.Toast.(Toast.java:68) at android.widget.Toast.makeText(Toast.java:231)

问题都是因为在子线程中请求更新UI。弹出Toast和更新UI都需要在主线程(UI thread)来完成。解决办法: 1.用AsyncTask来实现,就不提供具体的实现代码了 2.如果用到handler的时候:

private Handler handler = new Handler(Looper.getMainLooper()) {//获取主线程的looper

public void handleMessage(android.os.Message msg) {

};

};

3.用runOnUiThread来实现:

activity.runOnUiThread(new Runnable() {

@Override

public void run() {

//这是完成的操作

}

});

####Android Studio混淆代码时,出现这个问题:

Execution failed for task :xxxx:packageRelease

Unable to compute hash of D:\asspace\xxxx\xxxx\build\intermediates\classes-proguard\release\classes.jar

在Stack Overflow上找到类似的问题:http://stackoverflow.com/questions/32437167/unable-to-compute-hash-of# 解决办法为:Please, read warnings in console carefully. I`ve also faced with similar issue and in my case there were warnings about processing one of third party libraries. After applying corresponding changes related with the library to proguard file, all started to work correctly。 大致意思是:请仔细阅读控制台警告。 我也面临类似的问题,我遇到的问题是,对处理第三方库的警告。应用与图书馆的ProGuard文件相关的相应更改后,一切都开始正常工作。

我遇到的情况是:同样的第三方库被指定了两次,修改后就可以正常导出包了。可能是高版本的 sdk 通过 proguard 混淆代码时默认已经将 lib目录中的 jar 都已经添加到打包脚本中,所以不需要再次手动添加。

####在RecyclerView的Adapter中用ButterKnife bindView出现一下错误:

java.lang.RuntimeException: Unable to inject views for com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder@52700878

at butterknife.ButterKnife.inject(ButterKnife.java:221)

at butterknife.ButterKnife.inject(ButterKnife.java:184)

at com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder.(ButterknifeCustomBaseAdapter.java:59)

at com.murach.databasehomework.ButterknifeCustomBaseAdapter.getView(ButterknifeCustomBaseAdapter.java:70)

at android.widget.AbsListView.obtainView(AbsListView.java:2177)

at android.widget.ListView.makeAndAddView(ListView.java:1840)

at android.widget.ListView.fillDown(ListView.java:675)

at android.widget.ListView.fillFromTop(ListView.java:736)

at android.widget.ListView.layoutChildren(ListView.java:1655)

at android.widget.AbsListView.onLayout(AbsListView.java:2012)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at android.widget.FrameLayout.onLayout(FrameLayout.java:448)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:349)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at android.widget.FrameLayout.onLayout(FrameLayout.java:448)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1976)

at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1730)

at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)

at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)

at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)

at android.view.Choreographer.doCallbacks(Choreographer.java:562)

at android.view.Choreographer.doFrame(Choreographer.java:532)

at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)

at android.os.Handler.handleCallback(Handler.java:730)

at android.os.Handler.dispatchMessage(Handler.java:92)

at android.os.Looper.loop(Looper.java:137)

at android.app.ActivityThread.main(ActivityThread.java:5103)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:525)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)

at dalvik.system.NativeStart.main(Native Method)

Caused by: java.lang.reflect.InvocationTargetException

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:525)

at butterknife.ButterKnife.inject(ButterKnife.java:216)

at butterknife.ButterKnife.inject(ButterKnife.java:184)

at com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder.(ButterknifeCustomBaseAdapter.java:59)

at com.murach.databasehomework.ButterknifeCustomBaseAdapter.getView(ButterknifeCustomBaseAdapter.java:70)

at android.widget.AbsListView.obtainView(AbsListView.java:2177)

at android.widget.ListView.makeAndAddView(ListView.java:1840)

at android.widget.ListView.fillDown(ListView.java:675)

at android.widget.ListView.fillFromTop(ListView.java:736)

at android.widget.ListView.layoutChildren(ListView.java:1655)

at android.widget.AbsListView.onLayout(AbsListView.java:2012)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at android.widget.FrameLayout.onLayout(FrameLayout.java:448)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:349)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at android.widget.FrameLayout.onLayout(FrameLayout.java:448)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1976)

at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1730)

at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)

at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)

at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)

at android.view.Choreographer.doCallbacks(Choreographer.java:562)

at android.view.Choreographer.doFrame(Choreographer.java:532)

at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)

at android.os.Handler.handleCallback(Handler.java:730)

at android.os.Handler.dispatchMessage(Handler.java:92)

at android.os.Looper.loop(Looper.java:137)

at android.app.ActivityThread.main(ActivityThread.java:5103)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:525)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)

at dalvik.system.NativeStart.main(Native Method)

Caused by: java.lang.ClassCastException: android.widget.ImageButton cannot be cast to android.widget.TextView

at com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder$$ViewInjector.inject(ButterknifeCustomBaseAdapter$ViewHolder$$ViewInjector.java:13)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:525)

at butterknife.ButterKnife.inject(ButterKnife.java:216)

at butterknife.ButterKnife.inject(ButterKnife.java:184)

at com.murach.databasehomework.ButterknifeCustomBaseAdapter$ViewHolder.(ButterknifeCustomBaseAdapter.java:59)

at com.murach.databasehomework.ButterknifeCustomBaseAdapter.getView(ButterknifeCustomBaseAdapter.java:70)

at android.widget.AbsListView.obtainView(AbsListView.java:2177)

at android.widget.ListView.makeAndAddView(ListView.java:1840)

at android.widget.ListView.fillDown(ListView.java:675)

at android.widget.ListView.fillFromTop(ListView.java:736)

at android.widget.ListView.layoutChildren(ListView.java:1655)

at android.widget.AbsListView.onLayout(AbsListView.java:2012)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at android.widget.FrameLayout.onLayout(FrameLayout.java:448)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:349)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at android.widget.FrameLayout.onLayout(FrameLayout.java:448)

at android.view.View.layout(View.java:14289)

at android.view.ViewGroup.layout(ViewGroup.java:4562)

at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1976)

at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1730)

at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004)

at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5481)

at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)

at android.view.Choreographer.doCallbacks(Choreographer.java:562)

at android.view.Choreographer.doFrame(Choreographer.java:532)

at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)

at android.os.Handler.handleCallback(Handler.java:730)

at android.os.Handler.dispatchMessage(Handler.java:92)

at android.os.Looper.loop(Looper.java:137)

at android.app.ActivityThread.main(ActivityThread.java:5103)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:525)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)

at dalvik.system.NativeStart.main(Native Method)

检查View类型是否正确。

####Didn't find class "com.android.tools.fd.runtime.BootstrapApplication" 一个项目Debug包,安装在红米NOTE 1S手机上的时候崩溃退出,查看logcat发现报“java.lang.ClassNotFoundException: Didn't find class "com.android.tools.fd.runtime.BootstrapApplication"”:

FATAL EXCEPTION: main Process: cn.hnshangyu.electricproject, PID: 2454

java.lang.RuntimeException: Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication: java.lang.ClassNotFoundException: Didn't find class "com.android.tools.fd.runtime.BootstrapApplication" on path: DexPathList[[zip file "/data/app/cn.XXX-2.apk"],nativeLibraryDirectories=[/data/app-lib/cn.XXX-2, /vendor/lib, /system/lib]]

at android.app.LoadedApk.makeApplication(LoadedApk.java:509)

at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4413)

at android.app.ActivityThread.access$1500(ActivityThread.java:141)

at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)

at android.os.Handler.dispatchMessage(Handler.java:102)

at android.os.Looper.loop(Looper.java:136)

at android.app.ActivityThread.main(ActivityThread.java:5113)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:515)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)

at dalvik.system.NativeStart.main(Native Method)

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.android.tools.fd.runtime.BootstrapApplication" on path: DexPathList[[zip file "/data/app/cn.XXX-2.apk"],nativeLibraryDirectories=[/data/app-lib/cn.XXX-2, /vendor/lib, /system/lib]]

at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)

at java.lang.ClassLoader.loadClass(ClassLoader.java:497)

at java.lang.ClassLoader.loadClass(ClassLoader.java:457)

at android.app.Instrumentation.newApplication(Instrumentation.java:975)

at android.app.LoadedApk.makeApplication(LoadedApk.java:504)

at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4413)

at android.app.ActivityThread.access$1500(ActivityThread.java:141)

at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1272)

at android.os.Handler.dispatchMessage(Handler.java:102)

at android.os.Looper.loop(Looper.java:136)

at android.app.ActivityThread.main(ActivityThread.java:5113)

at java.lang.reflect.Method.invokeNative(Native Method)

at java.lang.reflect.Method.invoke(Method.java:515)

at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)

at dalvik.system.NativeStart.main(Native Method)

查看我的代码中并没有这个类,只能是系统自带的类,然后在网上搜索“com.android.tools.fd.runtime.BootstrapApplication”这个类在哪里出现,发现这个类是Instant Run方法用到的,因此应该是红米NOTE不支持 Instant Run才导致的。感谢lihenair的博客!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于Android和Flask的最炫广场舞APP设计与开发 一、研究目的 广场舞在国内越来越受到广大老年群体的喜爱,舞群组织不规范导致扰民问题时有发生、舞蹈教学视频缺乏导致广场舞爱好者训练难等问题。为了解决上述问题,设计和研发了最炫广场舞APP。 二、功能需求 本系统设计下列功能需求:1)提供周边舞群功能,规范市民周边舞群活动地点,并且做好登记和管理工作;2)提供当前热门舞蹈教学视频以及用户视频上传分享功能;3)提供周边舞具商品推荐功能;4)提供舞友交流功能。移动端基于Android实现,后台管理功能基于Python的Flask框架实现,数据库采用非关系型数据库MongoDB来搭建。系统所需图片、视频等文件信息存放在Apache服务器上,后端具体服务和文件存放部署在阿里云服务器上。 三、研究结果 为了满足预期目标,本系统重点在于设计实现周边舞群搜索和导航核心功能,以及舞蹈视频及时更新和上传下载功能,舞具商城、我的舞友以及时间服务功能。在实现的过程,对于如何调用百度地图SDK实现用户定位和相关舞群地址反向解析,并显示在用户端手机地图上遇到了不小困难,但是最后通过反复查阅专业书籍和网上博客文章,成功的解决了这一难题。在实现时间服务功能模块,由于Android系统的升级对闹钟API的安全性进行了限定,导致相关方法调用在到了指定时间后不会出现提醒,这也是本次系统开发遇到问题,最后通过参考GitHub上相关优秀项目示例,最终也成功解决了这一问题。 最后,本文基本上实现了系统立项时预定的所有需求功能。由于时间原因,除了系统核心功能外,存在部分功能实现的效果可能不符合预期要求。但是,后续时间充裕时,我还会继续丰富完善本系统相关功能。
《深入理解Android(卷1)》共10章,第1章介绍了阅读本书所需要做的准备工作,主要包括对Android系统架构和源码阅读方法的介绍;第2章通过对Android系统的MediaScanner进行分析,详细讲解了Android十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等进程的工作机制,同时还讨论了Android的启动速度、虚拟机HeapSize的大小调整、Watchdog工作原理等问题;第5章讲解了Android系统常用的类,包括sp、wp、RefBase、Thread等类,同步类,以及Java的Handler类和Looper类,掌握这些类的知识后方能在后续的代码分析做到游刃有余;第6章以MediaServer为切入点,对Android极为重要的Binder进行了较为全面的分析,深刻揭示了其本质。第7章对Audio系统进行了深入的分析,尤其是AudioTrack、AudioFlinger和AudioPolicyService等的工作原理。第8章深入讲解了Surface系统的实现原理,分析了Surface与Activity之间以及Surface与SurfaceFlinger之间的关系、SurfaceFlinger的工作原理、Surface系统的帧数据传输以及LayerBuffer的工作流程。第9章对Vold和Rild的原理和机制进行了深入的分析,同时还探讨了Phone设计优化的问题;第10章分析了多媒体系统MediaScanner的工作原理。 《深入理解Android(卷1)》适合有一定基础的Android应用开发工程师和系统工程师阅读。通过对本书的学习,大家将能更深刻地理解Android系统,从而自如应对实际开发遇到的难题。
在ViewPager嵌套ListView时,可能会遇到ListView无法滑动的问题,这是因为ViewPager会拦截ListView的滑动事件。解决方法如下: 1. 自定义ListView,重写其onInterceptTouchEvent()方法,返回false,让ViewPager不拦截ListView的滑动事件。 ``` public class MyListView extends ListView { public MyListView(Context context) { super(context); } public MyListView(Context context, AttributeSet attrs) { super(context, attrs); } public MyListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { final int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: setParentScrollAble(false); break; case MotionEvent.ACTION_UP: setParentScrollAble(true); break; } return super.onInterceptTouchEvent(ev); } private void setParentScrollAble(boolean flag) { getParent().requestDisallowInterceptTouchEvent(!flag); } } ``` 2. 在ViewPager的适配器,将ListView所在的布局设置为android:descendantFocusability="blocksDescendants",防止ListView获取焦点而导致ViewPager无法滑动。 ``` <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:descendantFocusability="blocksDescendants"> <com.example.MyListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> ``` 以上两种方法都可以解决ViewPagerListView失效的问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值