2016-04-06 18 views
0

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?

Antwort

0

Ich würde nicht versuchen, einen Screenshot von einem anderen Thread zu nehmen. Ich würde den Screenshot vom Hauptthread nehmen und ihn auf einem anderen Thread speichern.

Haben Sie den Zeichnungscache ausprobiert?

mScrollView.setDrawingCacheEnabled(true); 
Bitmap bitmap = Bitmap.createBitmap(mScrollView.getDrawingCache()); 
mScrollView.setDrawingCacheEnabled(false); 

Wenn es nicht die Leistung nicht verbessert, würde ich einen Screenshot von den Kindern mScrollView nehmen und sie in eine Bitmap auf einem anderen Thread montieren. Dadurch können Sie den UI-Thread zwischen untergeordneten Elementen erstellen.

+0

Drawing-Cache ist nutzlos, es wird ein Null-Bitmap für Scrollview erstellen. – ywwynm

+0

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