Ich brauche einen Screenshot für eine ScrollView. Mein Code ist wie unten:Screenshot für eine ScrollView im Worker-Thread
private File getScreenShot() {
final int count = mScrollView.getChildCount();
int height = 0;
for (int i = 0; i < count; i++) {
View view = mScrollView.getChildAt(i);
height += view.getHeight();
}
// get screen shot bitmap
Bitmap bitmap = Bitmap.createBitmap(mScrollView.getWidth(), height,
Bitmap.Config.RGB_565);
final Canvas canvas = new Canvas(bitmap);
mScrollView.draw(canvas);
// save to a temp file
return saveToFile(bitmap);
}
Weil mein mScrollView
so lang ist, dass einige Inhalte nach unten, bis Benutzerrollen versteckt werden, ist es viel Zeit der Erfassung der Screenshot (fast 100 ms) und stoppt vorübergehend den UI-Thread verbringt. Daher entscheide ich mich, die Methode in einem anderen Thread auszuführen. Code mag:
new Thread() {
@Override
public void run() {
System.out.println(Thread.currentThread());
mShareFile = getScreenShot();
mHandler.sendEmptyMessage(96);
}
}.start();
Aber etwas Interessantes kam: Ich habe versucht, eine Unterklasse von Thread
und AsyncTask
zu verwenden. Jeder von ihnen kann die Arbeit in der meisten Zeit erledigen. Aber in ein paar Mal wird eine Ausnahme app Absturz ausgelöst und verursachen wird:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Aber wie kann ich den Code erfolgreich in den meisten Zeit laufen? Ich meine, wenn ich diese Ausnahme bekomme, habe ich tatsächlich etwas falsch gemacht (rufe View.draw(Canvas)
außerhalb des Hauptthreads an). Der Fehler tritt nicht zum ersten oder zweiten Mal auf, während der Code zum dritten Mal ausgeführt wird. Und ich habe versucht, die ScrollView
zu scrollen und die Methode aufzurufen, bevor das Scrollen aufhört, kann es den Absturz verursachen. Aber wenn ich zum ersten Mal dasselbe mache, wird auch kein Crash passieren.
I Ausgang des Thread gehört es Hauptgruppe -> [Thema XXXXX, 5, main]
Ich weiß nicht, warum dieses seltsame Ergebnis ist passiert? Kann mir jemand den Grund sagen? Wie kann ich einen Screenshot eines ScrollView
in einem anderen Thread bekommen?
Drawing-Cache ist nutzlos, es wird ein Null-Bitmap für Scrollview erstellen. – ywwynm
Entschuldigung, Sie haben Recht. Habe auch gerade ein altes Projekt und Canvas verifiziert, wie ich es auch gemacht habe. Ich hatte kein Problem, also nehme ich an, dass Ihr Bildschirm mit Ansichten geladen ist :). Ich würde immer noch mit den Kindern anstatt der Scrollview gehen – user3802077