2016-04-06 13 views
0

Bir ScrollView için ekran görüntüsü almam gerekiyor. Kodum feryat geçerli:ekran alıntısı çalışan iş parçacığı içinde bir ScrollView olsun

benim mScrollView içeriğin bir kısmını aşağı kaydırma gizli kalır o kadar uzun olduğu için, ekran görüntüsü (yaklaşık 100 ms) yakalayan çok vakit geçiren ve geçici olarak UI iş parçacığı durdurur
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); 
} 

. Bu yüzden, yöntemi başka bir iş parçacığında çalıştırmaya karar verdim. Kod sever: ilginç

new Thread() { 
    @Override 
    public void run() { 
     System.out.println(Thread.currentThread()); 
     mShareFile = getScreenShot(); 
     mHandler.sendEmptyMessage(96); 
    } 
}.start(); 

Ama bir şey geldi: Ben Thread ve AsyncTask bir alt sınıfını kullanmaya çalıştı. Her biri işi en çok zamanda yapabilir. Ancak, birkaç kez bir istisna atılır ve uygulama çökmesine neden olacak:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

Ama nasıl en sürede başarıyla kod çalıştırabilir? Yani, bu istisnayı alabilirsem, gerçekten yanlış bir şey yaptım (View.draw(Canvas)'u ana iş parçacığının dışında arayın). Kod üçüncü kez gerçekleşirken ilk veya ikinci kez çalıştırıldığında başarısızlık olmayacak. Ve ScrollView'u kaydırmaya çalıştım ve durmadan önce yöntemi çağırıp kazaya neden olabilir. Ama aynı şeyi ilk kez yaparsam, kaza da olmaz.

ben çıkış parçacığı, ana gruba aittir - bu garip sonuç oldu nedenini bilmiyorum

> [ana Konu XXXXX, 5,]? Birisi bana nedenini söyleyebilir mi? ScrollView ekran resmini başka bir dizine nasıl alabilirim?

cevap

0

Başka bir iş parçacığı ekran görüntüsünü almaya çalışamazdım. Ekran görüntüsünü ana iş parçasından alır ve başka bir iş parçacığı üzerinde diske kaydederdim.

Çizim önbelleğini denediniz mi? performansı artırmak etmezse

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

, ben mScrollView çocuklarının bir ekran görüntüsü alıp başka iş parçacığı üzerinde bir bitmap halinde bunları bir araya olacaktır. UI iş parçacığını çocuklar arasında vermenizi sağlar.

+0

Çizim önbelleği kullanışsız, scrollview için boş bir bitmap oluşturacaktır. – ywwynm

+0

Üzgünüm, haklısın. Ayrıca eski bir proje ve tuval de doğrulanmıştı. Herhangi bir sorun zor olmadı, bu yüzden ekranınızın görünümleri ile yüklendiğini varsayalım :). Ben hala scrollview yerine çocuklarla giderdim. – user3802077

İlgili konular