在android 中我们一般用 Handler 做主线程 和 子线程 之间的通信 。
现在有了一种更为简洁的写法,就是 Activity 里面的 runOnUiThread( Runnable )方法。
利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable)。
Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI线程。
package com.app;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//创建一个线程
new Thread(new Runnable() {
@Override
public void run() {
//延迟两秒
try {
Thread.sleep( 2000 );
} catch (InterruptedException e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "hah", Toast.LENGTH_SHORT).show();
}).start();
Activity的runOnUiThread(Runnable)
* Runs the specified action on the UI thread. If the current thread is the UI
* thread, then the action is executed immediately. If the current thread is
* not the UI thread, the action is posted to the event queue of the UI thread.
* @param action the action to run on the UI thread
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
} else {
action.run();
在android 中我们一般用 Handler 做主线程 和 子线程 之间的通信 。现在有了一种更为简洁的写法,就是 Activity 里面的 runOnUiThread( Runnable )方法。 利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.run
方法一:Activity.runOnUiThread(Runnable )(经验之道: 这个最好用, 凡是要刷新页面的地方,Activity.runOnUiThread( new Runnable() { public void run(){更新UI}});方法二:子线程调用Handler的sendMessage(message)发送事件。 代码如下:mHandler = new Handler() { @Override public void handleMessage(Message msg) { //操作界面 myText.set
我们知道在Android开发中不能在非ui线程中更新ui,但是,有的时候我们需要在代码中执行一些诸如访问网络、查询数据库等耗时操作,为了不阻塞ui线程,我们时常会开启一个新的线程(工作线程)来执行这些耗时操作,然后我们可能需要将查询到的数据渲染到ui组件上,那么这个时候我们就需要考虑异步更新ui的问题了。
android中有下列几种异步更新ui的解决办法:
Activity.runOnUiThread(Runnable)
View.post(Runnable)
long) View.postDelayed(Runnable, long)
使用handler(线程间通讯)
闪屏页也称之为欢迎页。在打开一个App时,我们第一眼看到的往往是一个闪屏页面,之所以叫闪屏页,是因为它出现之后会短暂地停留几秒钟再跳转到其他页面。闪屏页除了使用户体验更好外,还能给app留出初始化数据的时间。下面,是我总结的闪屏页的三种写法。
打开Android Studio,新建一个projectMyStudy,新建一个SplashActivity并在清单文件中将其设置为启动Activity。在布局文件中将SplashActivity的背景设置为一张图片(可以是手机壁纸)。
<?xml version=1.0 encoding=utf-8?>
<RelativeLayou
所以我们要通过其他方式来动态改变ui视图,
1、runOnUiThread
activity提供的一个轻量级更新ui的方法,在Fragment需要使用的时候要用getActivity.runOnUiThread开启线程
这种方法最简单,方便更新一些不需要判断的通知,比如在聊天项目中动态获取未读消息数量。
runOnUiThread(new Runnable() {
@Override
public void run() {
sendMessage([自动回复]你好,我是机器人);
在Android开发的过程中,主线程主要来完成UI绘制和响应用户的操作,默认情况下,我们大部分的代码都是在主线程
中执行的,因此我们时刻要考虑主线程的情况。我们都知道要开启一个子线程来完成一个耗时操作,以避免阻塞主线程影响
用户体验,甚至ANR。但是子线程执行完要更新UI的时候,我们又必须回到主线程来更新,实现这一功能常用的方法是执行
Activity的runOnUiThread()方法:
runOnUiThread(new Runnable() {
void run() {
// do something
首先runOnUiThread是Activity内部的方法,在运用的时候最好指明当前环境变(Context).
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getId());
runOnUiThread(n
利用Activity.runOnUiThread(Runnable)把更新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给Activity.runOnUiThread(Runnable).
Runnable对像就能在ui程序中被调用。
* Runs the specified action on the UI thread. If the ...
Android中我们不在子线程中操作UI,但是如果非要在子线程中操作完后实现对UI操作,这里的实现方法如下:
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(new Runnable() {
@Override
public void run() { // 子线
static final int REFRESH_COMPLETE = 0X1112;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
1. 创建一个布局文件,其中包含ListView组件。
2. 创建一个自定义适配器,该适配器将在ListView中显示API数据。您可以使用BaseAdapter或ArrayAdapter来创建适配器。
3. 在您的代码中调用API并将返回的数据解析为您需要的格式。您可以使用HttpURLConnection或OkHttp等库来调用API。
4. 将解析的数据传递给您的自定义适配器,以便它可以在ListView中显示数据。
下面是一个简单的示例代码,演示如何在ListView中使用API数据:
```java
public class MainActivity extends AppCompatActivity {
private ListView mListView;
private MyAdapter mAdapter;
private List<String> mDataList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = findViewById(R.id.list_view);
mAdapter = new MyAdapter();
mListView.setAdapter(mAdapter);
//调用API并解析数据
fetchDataFromApi();
private void fetchDataFromApi() {
//使用OkHttp库调用API
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://your-api-url.com/data")
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//处理请求失败的情况
@Override
public void onResponse(Call call, Response response) throws IOException {
String responseData = response.body().string();
//解析数据
try {
JSONArray jsonArray = new JSONArray(responseData);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String data = jsonObject.getString("data");
mDataList.add(data);
//将数据传递给适配器
runOnUiThread(new Runnable() {
@Override
public void run() {
mAdapter.setData(mDataList);
} catch (JSONException e) {
e.printStackTrace();
private class MyAdapter extends BaseAdapter {
private List<String> mData;
public void setData(List<String> data) {
mData = data;
notifyDataSetChanged();
@Override
public int getCount() {
return mData == null ? 0 : mData.size();
@Override
public Object getItem(int position) {
return mData.get(position);
@Override
public long getItemId(int position) {
return position;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(MainActivity.this).inflate(R.layout.list_item, parent, false);
TextView textView = convertView.findViewById(R.id.text_view);
textView.setText(mData.get(position));
return convertView;
在上面的示例代码中,我们使用OkHttp库调用API并将返回的数据解析为JSON格式。然后,我们将解析的数据传递给自定义适配器,并在ListView中显示数据。请注意,在这个示例代码中,我们在UI线程中更新适配器的数据,以确保ListView正确地显示数据。