在我的日常 android 开发中,我在使用 android studio 进行调试时看到过几次应用程序崩溃的情况。我以为是安卓工作室的问题。今天我尝试使用 jdb 进行调试,但是当我键入"where"命令时,应用程序仍然崩溃。回溯停止在调用代理之类的地方,这与往常不同。通常,在回溯的顶部是类似handleMessage/nativePollOnce的东西。所以我开始想也许这是由代理引起的。所以我用代理写了一些简单的代码来验证它。应用在断点处崩溃。以前有人见过吗?如何使应用程序不崩溃?真的很烦人。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
bindProxy(new Runnable() {
@Override
public void run() {
setContentView(R.layout.activity_main); // Set breakpoint here
}
}).run();
}
Runnable bindProxy(final Runnable r) {
return (Runnable)Proxy.newProxyInstance(getClassLoader(), new Class[]{Runnable.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Wrapped runnable");
r.run();
return null;
}
});
}
}
JDB 回溯:
Breakpoint hit: "thread=main", android.support.v7.app.AppCompatActivity.setContentView(), line=139 bci=0
main[1] where
[1] android.support.v7.app.AppCompatActivity.setContentView (AppCompatActivity.java:139)
[2] com.example.ally.ipc.MainActivity$1.run (MainActivity.java:32)
[3] com.example.ally.ipc.MainActivity$2.invoke (MainActivity.java:44)
[4] java.lang.reflect.Proxy.invoke (Proxy.java:913)
The application has been disconnected
你需要这个Runnable
,它正在触摸一个View
,它不拥有? 您必须膨胀内容视图,并且不要接触其所有者范围之外的视图。就像这样:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
这是因为MainActivity
应该是View
的所有者;Runnable
甚至不能在UIThread
上运行 - 希望这应该可以理解,为什么这永远不会成功。