Android更新UI界面的几种方法的使用

更新UI界面:由于性能要求,Android不能在子线程中访问UI控件,只能在UI线程中更新UI,如果要想在其他线程中更新UI,可以通过以下几种方法更新UI:

1、使用Handler的handleMessage(Message msg)方法;

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            mTextView.setText("子线程通过handleMessage更新后的UI");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text_view_handle_send);
        new MyThread().start();
    }

    class MyThread extends Thread {
        @Override
        public void run() {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Message message = Message.obtain();
            handler.sendMessage(message);
        }
    }
}

2、使用Handler的post(new Runnable())方法;

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text_view_handle_post);
        handler.post(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                mTextView.setText("子线程通过post方法更新后的UI");
            }
        });
    }
}

3、使用runOnUiThread(new Runnable())方法,此方法只能运行在Activity当中;

public class MainActivity extends AppCompatActivity {
    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text_view_run_on_ui);
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                mTextView.setText("子线程通过runOnUiThread方法更新后的UI");
            }
        });
    }
}

4、使用View的post(new Runnable())方法,其底层也是调用Handler.post(new Runnable())方法;

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text_view_post);
        mTextView.post(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                mTextView.setText("子线程通过view.post方法更新后的UI");
            }
        });
    }
}

5、使用AsyncTask异步任务类;

public class MainActivity extends AppCompatActivity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text_view_async_task);
        new MyAsyncTask().execute();
    }

    class MyAsyncTask extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(String... params) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String str = "子线程通过AsyncTask异步更新后的UI";
            // 返回结果给到onPostExecute方法
            return str;
        }

        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(String result) {
            mTextView.setText(result);
            super.onPostExecute(result);
        }
    }
}
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值