我以以下方式创建线程:
GraphThread thread = new GraphThread(context, handler, string);
请注意,处理程序是静态处理程序对象,这可能会导致问题。我一直在这行代码中出现错误。但是,该错误不会在其他虚拟设备(例如API 23和25)以及我的物理设备(牛轧糖)中出现。
我确实尝试设置了一个try {} catch块,但是它没有捕获异常,这是不寻常的。堆栈跟踪如下:
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:389)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
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:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
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:515)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick**(AppCompatViewInflater.java:384)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
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:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.VerifyError: noodlesoup/solver/GraphThready
at noodlesoup.solver.MainActivity.clikButton(MainActivity.java:4985)
这归结为java.lang Verifyerror,我相信是通过传递参数static Handler创建的。我不知道为什么这会在API 19虚拟设备中发生,而不是在我测试过的其他虚拟设备中发生。
有什么想法或建议吗?
答案 0 :(得分:0)
在阅读了许多文章之后,我遇到了以下想法:Thread类中的void run方法太复杂了。在run方法中定义的变量太多;对于包含超过4000行代码的方法,要做出的决定太多。以下是让我产生想法的帖子和答案: VerifyError - Verifier rejected class
所以,我要做的就是在Thread类中创建额外的方法,它们是 他们的工作等于run方法中的4000多行代码。
最后,Thread类结构如下所示,并且编译时没有更多验证错误:
public class GraphThready extends Thread{
//...
GraphThready(){
//...
}
public void run(){
super.run();
if(some condition)
methodToDoTask1();
if(another condition)
methodToDoTask2();
if(a different condition)
methodToDoTask3();
}
private void methodToDoTask1(){
}
private void methodToDoTask2(){
}
private void methodToDoTask3(){
}
}