android 应用程序可能在它的主线程上做太多工作。怎么解决

public class MainActivity extends Activity {
private boolean suspend = true;
@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final ImageView imageView = (ImageView) findViewById(R.id.image);
    imageView.setBackgroundResource(R.drawable.imagelong2);
    final ClipDrawable drawable = (ClipDrawable) imageView.getDrawable();
    ToggleButton toggleButton = (ToggleButton) findViewById(R.id.togbtn);
    toggleButton.setText("播放");
    toggleButton.setTextOn("暂停");
    toggleButton.setTextOff("播放");
    toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (suspend == true) {
                //获取图片所显示的ClipDrawable对象

                final Handler handler = new Handler() {
                    @Override
                    public void handleMessage(Message msg) {
                        // TODO Auto-generated method stub
                        if (msg.what == 0x123) {
                            drawable.setLevel(drawable.getLevel() + 1);
                        }
                    }
                };
                final Timer timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        Message msg = new Message();
                        msg.what = 0x123;
                        handler.sendMessage(msg);
                        if (drawable.getLevel() >= 10000) {
                            timer.cancel();
                        }
                    }
                }, 0, 1);

                suspend = false;
                if (suspend == false) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                suspend = true;

            }

        }
    });
}

}


写了一个 ClipDrawable的进度条 想控制暂停让线程等待出现错误Skipped 127 frames! The application may be doing too much work on its main thread. 只有加了Thread.sleep(2000);以后在有这个问题,会很卡,请问我这个要怎么改啊

setContentView(R.layout.activity_main);
final ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.setBackgroundResource(R.drawable.imagelong2);
final ClipDrawable drawable = (ClipDrawable) imageView.getDrawable();
ToggleButton toggleButton = (ToggleButton) findViewById(R.id.togbtn);
toggleButton.setText("播放");
toggleButton.setTextOn("暂停");
toggleButton.setTextOff("播放");

    final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0x123) {
                drawable.setLevel(drawable.getLevel() + 1);
                if (drawable.getLevel() >= 10000) {
                    //不再发送message
                } else{
                    Message nextMsg = Message.obtain(this, 0x123);
                    sendMessage(nextMsg);
                }
            }
        }
    };
    toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            //获取图片所显示的ClipDrawable对象
            Message nextMsg = Message.obtain(handler, 0x123);
            handler.sendMessage(nextMsg);
        }
    });

修改成这样试试

代码出现了错误,改一下就很高了

你是只点击了一下就显示Skipped 127 frames这个了?

boolean isSuspend = false;
long mStartTime;
int mDuration;
private Interpolator mAnimationInterpolator = new LinearInterpolator();
private IntEvaluator mAnimationEvaluator = new IntEvaluator();
private int mEnd;
private int mStart;
private final static int DEFAULT_DURATION = 10000;

final ClipDrawable clipDrawable = new ClipDrawable(getResources().getDrawable(R.drawable.test), Gravity.LEFT, ClipDrawable.HORIZONTAL);
ImageView imageView = (ImageView) findViewById(R.id.image);
imageView.setImageDrawable(clipDrawable);
clipDrawable.setLevel(10000);

    final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0x102) {
                float input = ((float)(SystemClock.elapsedRealtime() - mStartTime)) / mDuration;
                if(input > 1.0f){
                    clipDrawable.setLevel(mEnd);
                    isSuspend = true;

// sendEmptyMessage(0x103);
} else{
float fraction = mAnimationInterpolator.getInterpolation(input);
int value = mAnimationEvaluator.evaluate(fraction, mStart, mEnd);
clipDrawable.setLevel(value);
sendEmptyMessage(0x102);
}
} else if(msg.what == 0x101){//start
if((Boolean)(msg.obj)) {
clipDrawable.setLevel(0);
mStartTime = SystemClock.elapsedRealtime();
mDuration = DEFAULT_DURATION;
mStart = 0;
mEnd = 10000;
} else{
//继续前面的动画
mStartTime = SystemClock.elapsedRealtime();
mStart = clipDrawable.getLevel();
mEnd = 10000;
}
sendEmptyMessage(0x102);
} else if(msg.what == 0x103){//end 这里的处理是重启动画
Message nextMsg = Message.obtain(this, 0x101);
nextMsg.obj = true;
sendMessage(nextMsg);
}
}
};
isSuspend = true;
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(isSuspend){
if(clipDrawable.getLevel() <= 0 || clipDrawable.getLevel() >= 10000){//重新开始
Message nextMsg = Message.obtain(handler, 0x101);
nextMsg.obj = true;
handler.sendMessage(nextMsg);
} else{
Message nextMsg = Message.obtain(handler, 0x101);
nextMsg.obj = false;
handler.sendMessage(nextMsg);
}
isSuspend = false;
} else{
handler.removeMessages(0x101);
handler.removeMessages(0x102);
handler.removeMessages(0x103);
//计算当前已经走过的时间
mDuration = mDuration - (int)(SystemClock.elapsedRealtime() - mStartTime);
isSuspend = true;
}
}
});

我修改了一下 这样就可以控制时间而且可以点击停止再点击启动了

这个问题是有根本性原因的,因为view的刷新限制,为了在16ms,即fps=60的情况下刷新页面,如果操作大于16ms,就会爆出这个错误,并且延迟本次刷新
等下一次的16ms,所以想解决这个原因开子线程吧