package com.example.goodtest;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;public class Goodtest extends Activity {
View abc;
View add;
ImageView image;
Bitmap bm;
Thread rrr;
int[] shuzhu;
Handler han; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.goodtest);
abc = findViewById(R.id.abc);
add = findViewById(R.id.add);
image = (ImageView) findViewById(R.id.imageView1);
shuzhu = new int[] { R.drawable.look1, R.drawable.look2,
R.drawable.look3, R.drawable.look4, R.drawable.look5,
R.drawable.look6, R.drawable.look7, R.drawable.look8,
R.drawable.look9, R.drawable.look10, R.drawable.look11,
R.drawable.look12, R.drawable.look13, R.drawable.look14,
R.drawable.look15 };
View.OnClickListener abc_click = new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自动生成的方法存根
((ImageView) findViewById(R.id.imageView1))
.setImageBitmap(null);
}
};
abc.setOnClickListener(abc_click);
View.OnClickListener add_click = new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO 自动生成的方法存根
han = new Handler() {
public void handleMessage(android.os.Message msg) { BitmapFactory.Options youhua = new BitmapFactory.Options();
youhua.inSampleSize = 2;
bm = BitmapFactory.decodeResource(getResources(),
shuzhu[msg.what], youhua);
image.setImageBitmap(bm);
System.gc(); };
};
rrr = new Thread(new Runnable() { @Override
public void run() {
// TODO 自动生成的方法存根
Message msg = new Message(); int j = 0;
for (int i = 0; i < 30; i++) {
msg.what = j;
han.sendMessage(msg);
j++;
if (j > 14) {
j = 0;
}
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
} }
});
rrr.start();
}
};
add.setOnClickListener(add_click);
findViewById(R.id.imageView1).setOnClickListener(
new View.OnClickListener() { @Override
public void onClick(View v) {
// TODO 自动生成的方法存根
System.out.println(22222222);
}
});
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.goodtest, menu);
return true;
}
}如果我,按空白的地方,或者其他按钮,会导致崩溃~~~~~~~~~
如果把Thread.sleep(200);时间太短也会崩溃~~~~~~~~
不是用线程更新UI吗?为什么还会崩溃~~~~~~~~~~~~~~~

解决方案 »

  1.   

    OOM吧,我昨天也碰到这问题.是Android只比Bitmap分配最多8M空间,
    而Java的内存回收机制特征,导致内存不能及时回收而溢出.除了设置inSampleSize属性外,还没有找到其它方法.
      

  2.   

    android的CG系统不是可以自动回收吗?
      

  3.   

    11-01 13:43:52.695: D/dalvikvm(298): GC freed 776 objects / 59512 bytes in 117ms
    11-01 13:43:53.435: D/dalvikvm(298): GC freed 61 objects / 2264 bytes in 85ms
    11-01 13:43:53.615: D/dalvikvm(298): GC freed 128 objects / 5904 bytes in 98ms
    11-01 13:43:55.215: I/System.out(298): 22222222
    11-01 13:43:55.444: I/System.out(298): 22222222
    11-01 13:43:56.644: D/dalvikvm(298): GC freed 44 objects / 1776 bytes in 119ms
    11-01 13:43:56.665: E/JavaBinder(298): *** Uncaught remote exception!  (Exceptions are not yet supported across processes.)
    11-01 13:43:56.665: E/JavaBinder(298): android.util.AndroidRuntimeException: { what=1006 when=3636892 arg1=1 obj=MotionEvent{44e51098 action=0 x=266.0 y=379.0 pressure=0.0 size=0.0} } This message is already in use.
    11-01 13:43:56.665: E/JavaBinder(298):  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:173)
    11-01 13:43:56.665: E/JavaBinder(298):  at android.os.Handler.sendMessageAtTime(Handler.java:457)
    11-01 13:43:56.665: E/JavaBinder(298):  at android.view.ViewRoot.dispatchPointer(ViewRoot.java:2615)
    11-01 13:43:56.665: E/JavaBinder(298):  at android.view.ViewRoot$W.dispatchPointer(ViewRoot.java:2810)
    11-01 13:43:56.665: E/JavaBinder(298):  at android.view.IWindow$Stub.onTransact(IWindow.java:121)
    11-01 13:43:56.665: E/JavaBinder(298):  at android.os.Binder.execTransact(Binder.java:287)
    11-01 13:43:56.665: E/JavaBinder(298):  at dalvik.system.NativeStart.run(Native Method)
    11-01 13:43:57.575: D/dalvikvm(298): GC freed 274 objects / 23672 bytes in 92ms
    11-01 13:44:00.658: D/dalvikvm(298): GC freed 77 objects / 3656 bytes in 91ms
    11-01 13:44:01.635: D/dalvikvm(298): GC freed 10 objects / 368 bytes in 83ms
    11-01 13:44:01.724: I/dalvikvm(298): threadid=7: reacting to signal 3
    11-01 13:44:01.797: I/dalvikvm(298): Wrote stack trace to '/data/anr/traces.txt'
    11-01 13:44:04.415: I/System.out(298): 22222222
    11-01 13:44:04.445: I/System.out(298): 22222222
    11-01 13:44:04.465: E/JavaBinder(298): *** Uncaught remote exception!  (Exceptions are not yet supported across processes.)
    11-01 13:44:04.465: E/JavaBinder(298): android.util.AndroidRuntimeException: { what=1006 when=3637807 arg1=1 obj=MotionEvent{44e51098 action=0 x=266.0 y=379.0 pressure=0.0 size=0.0} } This message is already in use.
    11-01 13:44:04.465: E/JavaBinder(298):  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:173)
    11-01 13:44:04.465: E/JavaBinder(298):  at android.os.Handler.sendMessageAtTime(Handler.java:457)
    11-01 13:44:04.465: E/JavaBinder(298):  at android.view.ViewRoot.dispatchPointer(ViewRoot.java:2615)
    11-01 13:44:04.465: E/JavaBinder(298):  at android.view.ViewRoot$W.dispatchPointer(ViewRoot.java:2810)
    11-01 13:44:04.465: E/JavaBinder(298):  at android.view.IWindow$Stub.onTransact(IWindow.java:121)
    11-01 13:44:04.465: E/JavaBinder(298):  at android.os.Binder.execTransact(Binder.java:287)
    11-01 13:44:04.465: E/JavaBinder(298):  at dalvik.system.NativeStart.run(Native Method)
    11-01 13:44:04.978: D/dalvikvm(298): GC freed 304 objects / 25632 bytes in 404ms
    11-01 13:44:06.545: D/AndroidRuntime(298): Shutting down VM
    11-01 13:44:06.555: W/dalvikvm(298): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
    11-01 13:44:06.555: E/AndroidRuntime(298): Uncaught handler: thread main exiting due to uncaught exception
    11-01 13:44:06.568: E/AndroidRuntime(298): android.util.AndroidRuntimeException: { what=1000 when=3644933 } This message is already in use.
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:173)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.os.Handler.sendMessageAtTime(Handler.java:457)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.os.Handler.sendMessageDelayed(Handler.java:430)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.os.Handler.sendEmptyMessageDelayed(Handler.java:394)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.os.Handler.sendEmptyMessage(Handler.java:379)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.view.ViewRoot.scheduleTraversals(ViewRoot.java:615)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.view.ViewRoot.requestLayout(ViewRoot.java:559)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.view.View.requestLayout(View.java:7918)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.view.View.requestLayout(View.java:7918)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.view.View.requestLayout(View.java:7918)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.view.View.requestLayout(View.java:7918)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:255)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.view.View.requestLayout(View.java:7918)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.view.View.requestLayout(View.java:7918)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.widget.ImageView.setImageDrawable(ImageView.java:306)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.widget.ImageView.setImageBitmap(ImageView.java:320)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at com.example.goodtest.Goodtest$2$1.handleMessage(Goodtest.java:57)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.os.Handler.dispatchMessage(Handler.java:99)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.os.Looper.loop(Looper.java:123)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at android.app.ActivityThread.main(ActivityThread.java:4363)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at java.lang.reflect.Method.invokeNative(Native Method)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at java.lang.reflect.Method.invoke(Method.java:521)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
    11-01 13:44:06.568: E/AndroidRuntime(298):  at dalvik.system.NativeStart.main(Native Method)
    11-01 13:44:06.596: I/dalvikvm(298): threadid=7: reacting to signal 3
    11-01 13:44:06.605: I/dalvikvm(298): Wrote stack trace to '/data/anr/traces.txt'
    11-01 13:44:08.535: I/Process(298): Sending signal. PID: 298 SIG: 9
      

  4.   

    应该是分配内存不够导致溢出。手机不是电脑,很正常,解决方案最好是Thread.sleep一定的时间。
      

  5.   

    不按,不會出現崩潰,我把youhua.inSampleSize設置為100都會崩潰,不是內存問題的!!!!
      

  6.   

    This message is already in use.
    说明消息被重复使用了
      

  7.   

    例如:Message msg = myHandler.obtainMessage();
    msg.arg1 = 1;
    myHandler.sendMessage(msg);
    msg.arg1 = 2;
    myHandler.sendMessage(msg);应修改为:
    Message msg = myHandler.obtainMessage();
    msg.arg1 = 1;
    myHandler.sendMessage(msg);
    msg = myHandler.obtainMessage();
    msg.arg1 = 2;
    myHandler.sendMessage(msg);
      

  8.   

    非常 非常 非常 非常 非常 感激(yinke22222)~~~~~~~~~~~~~~~~~~~~~~~~~~~~这个问题以及困扰我一个星期了~~~~~~~~~~~~~~~~~~~~~~~~~~~~非常感谢你~~~~~~~~~~~~~~~~~~~
      

  9.   

    但是我想问一下,太多的NEW会不会导致,时间长了(1个小时后)会崩溃的呢?
    怎么人手去收回?