안드로이드 개발 질문/답변
(글 수 45,052)
안녕하세요.
안드로이드 어플 개발중에 Failed binder transaction 라는 에러가 떠서 이렇게 질문드립니다.
static byte [] move0 = {6,14, 6,15, 6,16, 6,17,
7,12, 7,13, 7,18, 7,19,
8,11, 8,14, 8,19, 8,20,
9,10, 9,15, 9,16, 9,17, 9,18, 9,21,
10,10, 10,21,
11,9, 11,19, 11,20, 11,22,
12,9, 12,11, 12,12, 12,13, 12,18, 12,21, 12,22,
13,9, 13,10, 13,14, 13,17, 13,22,
14,10, 14,14, 14,17, 14,21,
15,11, 15,12, 15,13, 15,14, 15,15, 15,16, 15,17, 15,18, 15,19, 15,20};
라는 애가 있고, 서비스를 만들었고 그 안에는
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Thread run = new Thread() {
public void run() {
while (running) {
try { Thread.sleep(1000); }
catch (InterruptedException e) { Log.i("XXX", "ERROR"); }
Intent intent = new Intent(XXXService.this, XXXProvide.class);
intent.setAction(XXX_UPDATE);
intent.putExtra(X, move0);
sendBroadcast(intent);
}
}
};
run.start{};
return START_STICKY;
}
를 해줬습니다. 그런데 처음에는 자알 나가다가, 약 30초 정도 지나면 Failed binder transaction 라는 에러가 나기 시작하는데 도대체 왜 그런건가요? 검색을 해보니, 용량이 큰 비트맵 이미지 같은 걸 넘기다 보면 특히 많이 발생하는 문제라는데, 제가 보내는건 그저 byte 들의 집합 이거늘..
저기서 받은 배열들을 값으로,
public void setPixel(Context context, byte ...b){
pixWhite = BitmapFactory.decodeResource(context.getResources(),R.drawable.pixelwhite);
pixBlack = BitmapFactory.decodeResource(context.getResources(),R.drawable.pixelblack);
pixWhite = Bitmap.createScaledBitmap(pixWhite , size, size, true);
pixBlack = Bitmap.createScaledBitmap(pixBlack , size, size, true);
background = Bitmap.createBitmap(99, 51, Bitmap.Config.RGB_565);
canvas = new Canvas(background);
canvas.drawColor(Color.LTGRAY);
for(byte i = 1; i < 17; i++){
for(byte j = 1; j < 33; j++){
canvas.drawBitmap(pixWhite, size*j - size,size*i - size, null);
}
}
for(byte i = 0; i < b.length; i+=2){
canvas.drawBitmap(pixBlack, size*(b[i+1]) - size,size*b[i] - size, null);
}
views.setImageViewBitmap(R.id.pixelMonitor, background);
}
캔버스를 그린 후에, 위젯에다가 setImageViewBitmap 으로 찍어 줍니다. 붉은 색을 주석으로 치면, 위젯에 그림이 그려지지는 않지만 에러도 뜨지 않더라구요.. 이걸 처리하는 과정에서 뭔가 잘못 된 듯 싶은데..
고수님들의 조언이 절실히 필요합니다. ㅠ_ㅠ
2012.01.30 14:55:45
네. views 를 다 그린 후에,
ComponentName cn = new ComponentName(context, XXXProvide.class);
AppWidgetManager.getInstance(context).updateAppWidget(cn, WidgetView.views);
를 통해 위젯 뷰 업데이트를 하는데, 문제는 해결 되었어요!
if(views != null) views.removeAllViews(R.layout.widget);
views = new RemoteViews(context.getPackageName(),R.layout.widget);
views.setImageViewBitmap(R.id.pixelMonitor, background);
뷰를 그릴 때, 이렇게 그려주니 해결되었네요. removeAllViews 를 해주니 기존에 그렸던 애들이 계속 쌓이는 문제(라는게 있었는듯)가 해결되어서 Failed 어쩌구 하는 오류가 안나네요.
감사합니다!




흠.. widget 이면 RemoteView를 사용하는거 아닌가요?
views는 실재로는 다른 화면에 있는 View니까 이미지가 고스라니 넘어 갈껀데..
views 업데이트가 지속되면 사이즈가 커지나 ``??
AppWidgetManager wam = AppWidgetManager.getInstance(context);
wam.updateAppWidget(appWidgetIds, views);
이런 식으로 뷰 업데이트를 계속 하는거에용?