UI线程和bitmap

Bitmap

ByteArrayOutputStream out = new ByteArrayOutputStream();
Bitmap bitmap = Bitmap.createBitmap(this.getWidth(), this.getHeight(),Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
this.draw(canvas);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);

压缩JPEG格式的图片会比压缩PNG格式的图片快很多

有时当图片太大导致奔溃,可以尝试将图片移动到mipmap目录下,奔溃问题就可以解决

组件移动卡顿

解决方法1:
使用硬件加速

android:hardwareAccelerated="true"

解决方法2:
可以在1的基础上解决

在ondraw时候尽量不要处理太多的事情,比如画圆什么的,移动的尽量是一个固定的图片,比如移动bitmap

Ui操作

设置textColor的选中颜色,需要在selector中设置颜色

<item name="android:textColor">@drawable/templator_type_text_selectoritem>

Android UI线程

Android UI线程(主线程)有几个特点:

只能在 UI 线程操作 UI 视图,不能在子线程中操作。
不能在 UI 线程中进行耗时操作,否则会阻塞 UI 线程,引起 ANR、卡顿等问题。

1.可以使用Handler更新UI

Handler mHandler = newHandler(){
    @Override
    publicvoid handleMessage(Message msg){
        if(msg.what == 1){
            textView.setText("Task Done!!");
        }
    }
};
mRunnable = new Runnable() {
    @Override
    publicvoid run() {
        SystemClock.sleep(1000);    // 耗时处理
        mHandler.sendEmptyMessage(1);  
    }
};
private void startTask(){
    new Thread(mRunnable).start();
}

2.AsyncTask
AsyncTask 的实例必须在 UI Thread 中创建。
只能在 UI 线程中调用 AsyncTask 的 execute 方法。
AsyncTask 被重写的四个方法是系统自动调用的,不应手动调用。
每个 AsyncTask 只能被执行一次,多次执行会引发异常。
AsyncTask 的四个方法,只有 doInBackground 方法是运行在其他线程中,其他三个方法都运行在 UI 线程中,也就说其他三个方法都可以进行 UI 的更新操作

** Activity的ui线程 **

activity.runOnUiThread(new Runnable() {
                    public void run() {
                        onPostExecute();
                    }
                });

你可能感兴趣的:(ui)