UPDATE 05/08/12 7:23 AM:
ドロー/トーストを交換しようとしました。つまり、ドローをAsyncTaskに入れ、トーストをメインUIスレッドに入れましたが、それでも喜びはありませんでした。動作に変化はありません。あきらめる。しかし、提案してくれたすべての人に感謝します。
-ジョン
======================================
UPDATE 05/04/12 6:30 PM:
「シングルタスク」の問題が問題であり、ワーカースレッドが機能する可能性があると思いましたが、定義上、両方のスレッドがUI(メインスレッド)にアクセスする必要があるため、私にはまだ論争があるように。それでも、提案に基づいて、トーストをAsyncTaskのonProgressUpdate()に入れましたが、恐れていたように、問題は解決しません。(それはモンスターであり、他のタスクに単純なトーストを入れる方が快適だったので、レンダリングを非同期タスクに入れたくありませんでした)。だから、まだ喜びはありません。これを行う方法に関する他の提案はありますか?
======================================
ビットマップを作成して画面に描画するアプリケーションを作成しました。ビットマップの作成には2〜3秒かかるため、「リフレッシュしてください、スタンバイしてください...」などのトーストメッセージをユーザーに表示したいと思います。私の問題は、 drawBitmap( )の前にToast()を呼び出しても、ペイントが完了するまでトーストが表示されないことです。
以前、Windowsでこのような動作が見られたのは、長い計算中にメッセージキューがバックアップされたためです。解決策は、長い計算中にメッセージを定期的に明示的にディスパッチすることでした。しかし、Androidでこれを行うかどうか/方法がわかりません。多分不思議な(私にとって)「ルーパー」???
問題を切り分け/実証する、小さくて些細なアプリを含めました。
どんな提案でも大歓迎です。
-ジョン
// PixmapTestMain.java
public class PixmapTestMain extends Activity {
public static View PixmapView; // pixmap view
public static Context Ctx;
// Create activity
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Ctx = this;
PixmapView = findViewById( R.id.pixmap );
}
// Handle click
public void onClick(View v) { // button view clicked
PixmapView.invalidate(); // new pixmap
}
} // end class PixmapTestMain
カスタムビュー:
// PixmapView - my custom view
public class PixmapView extends View {
static final int Wide=1000,High=1000,Size=(Wide*High);
static int toggle;
// Construct a view to display pixmap
public PixmapView(Context ctx,AttributeSet attrs) {
super(ctx, attrs);
}
// Handle onDraw callback
@Override
protected void onDraw( Canvas canvas) {
int[] pixmap;
Bitmap bm;
super.onDraw(canvas);
toast( "Refreshing..." );
pixmap = createPixmap();
bm = Bitmap.createBitmap( pixmap, Wide, High, Bitmap.Config.ARGB_8888 );
canvas.drawBitmap( bm, 0, 0, null );
}
// Create a pixmap
int[] createPixmap()
{
int i,color;
int[] pm;
double s;
Random rand = new Random();
pm = new int[Size]; // allocate pixmap
toggle++;
if( (toggle&1)==0 ) color = 0xff0000ff; // red
else color = 0xffff0000; // blue
for( i=0; i<Size; i++ ) {
pm[i] = color;
rand.nextLong(); // slow me down
}
return( pm );
}
// Flash a toast message
public void toast( String msg)
{
if( PixmapTestMain.Ctx == null ) return;
Toast.makeText( PixmapTestMain.Ctx, msg, 0 ).show();
}
}
レイアウト:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button
android:text="Refresh"
android:id="@+id/refresh"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"/>
<com.hyperdyne.PixmapTest.PixmapView
android:id="@+id/pixmap"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</LinearLayout>