1

robotium テストの 1 つで content.setDrawingCacheEnabled(true) を呼び出そうとすると、問題が発生します。コンテキストで描画キャッシュを有効にしようとすると、CalledFromWrongThreadException が発生することがあります。これは、エミュレーターで実行している場合にのみ発生するようです。デバイス(Samsung S2)でこれを試すと、毎回動作します...

ここにコードがあります

呼び出し機能:

String screnshotName = String.format("SS_Cities_%s.png", s);
File ssDir = Environment.getExternalStorageDirectory();
TestUtilities.takeScreenShot(solo.getCurrentActivity(), ssDir, screnshotName);

スクリーンショット関数 (例外をスローする):

public static void takeScreenShot(Activity activity, File Directory, String FileName) throws Exception {
    View content = activity.findViewById(R.id.content);

    ***// This is a horrible hack that i want to get rid of***
    // Occasiaonally setDrawingCacheEnabled throws a CalledFromWrongThreadException
    int MAX_RETRIES = 10;
    for(int i = 0; i < MAX_RETRIES; i++)
    {
        try{
            content.setDrawingCacheEnabled(true);
            continue;
        }
        catch (Exception e){}

    }

    content.buildDrawingCache();
    Bitmap b = content.getDrawingCache();
    File outputFile = new File(Directory.toString() + "/" + FileName);

    try {
        if (!Directory.exists()) {
            Directory.mkdirs();
        }
        if (!Directory.canWrite()) {
            throw new Exception("Directory not writable");
        }

        FileOutputStream fos = new FileOutputStream(outputFile);

        if (fos != null) {
            b.compress(Bitmap.CompressFormat.PNG, 90, fos);
            fos.close();
        }
    } catch (Exception e) {
        String screenshotError = String.format("Error taking screenshot: %s", e.toString());
        throw new Exception(screenshotError);
    }
}

テスト中のアプリケーションに設定されたアクセス許可:

<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4

2 に答える 2

1

Android エミュレーターは、外部ストレージで常に正常に動作するとは限りません。そのため、これらのエラーが発生する可能性があります。したがって、外部ストレージを使用するアプリをテストするときはいつでも、実際のデバイスでテストすることをお勧めします。これは、エミュレーターにまだ存在するすべての「未修正」エラーが発生するわけではないためです。

于 2011-11-15T19:10:24.990 に答える
0

UIThread から takeScreenShot メソッドを実行するかどうかはわかりませんが、私が見る限り、あなたの質問はここで答えられていると思います:

StackOverflow: CalledFromWrongThreadException

于 2012-11-30T15:48:51.390 に答える