Ich werde oft wütend auf Thread, wenn ich Cordova.framework benutze, also nehme ich ein Gebot, um es aufzuschreiben.
adb.logcat
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
Dies geschieht, wenn Sie eine Ansicht in einem Hintergrundthread erstellen.
Cordova ist nicht im Grunde genommen, weil es eine Web-Engine verwendet, aber ... Es gibt Zeiten, in denen ich NativeView verwenden muss, also ist das der Zeitpunkt.
Zum Beispiel
test.Java
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
cordova.getActivity().runOnUiThread(new Runnable() {
public void run() {
...
timerView = view.findViewById(R.id.hogeview);
//Kein guter Punkt! !! !!
mHandler().postDelayed(new Runnable() {
@Override
public void run() {
mRootView.addView(timerView);
},200);
}
}
});
return true;
}
Dies ist ein Beispiel für das, was ich getan habe, weil die Ansichtsgenerierung stark war und der Bildschirmübergang eingeklemmt war. Eine weitere Verzögerungsverarbeitung wird in die Thread-Verarbeitung von Cordova geschrieben. Looper wird grundsätzlich auf dem UI-Thread ausgeführt. Wenn Sie also den Thread mit Handler ändern, funktioniert Looper nicht.
Da die Erstellung von View diesmal sehr umfangreich ist, wird sie von cordova.getActivity (). RunOnUiThread () aufgerufen, also mHandler (). PostDelayed (new Runnable () { Wird loswerden.
test.Java
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
cordova.getActivity().runOnUiThread(new Runnable() {
public void run() {
...
timerView = view.findViewById(R.id.hogeview);
mRootView.addView(timerView);
}
});
return true;
}
Oder es gibt eine Möglichkeit, Looper selbst zu implementieren. Grundsätzlich handelt es sich jedoch um eine von Framework aufgerufene Methode, die daher verboten ist.
Ich mache oft so einfache Dinge ...
Recommended Posts