Android 操作UI线程的一些方法

  我们经常会在后台线程中去做一些耗时的操作,比如去网络取数据。但是当数据取回来,需要显示到页面上的时候,会遇到一些小麻烦,因为我们都知道,android的UI页面是不允许在其他线程直接操作的。下面总结4中方法用来在线程中操作UI界面。

  模拟耗时操作

private void connectNet() throws InterruptedException {
        Thread.sleep(2000);
}

  方法一:Handler

子线程中通过Handler的sendMessage(msg)发送事件:

private void method1() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                //耗时操作
                connectNet();
                //向Handler发送消息
                mHadndler.sendEmptyMessage(111);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

  方法二:View.post(Runnable)

private void method2() {
    myText.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        //耗时操作
                        connectNet();
                        myText.post(new Runnable() {
                            @Override
                            public void run() {
                                myText.setText("联网结束,更新UI数据");
                            }
                        });
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    });
}

  方法三:Activity.runOnUiThread

与view.post类似

private void method3() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                //耗时操作
                connectNet();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        myText.setText("runOnUiThread...");
                    }
                });
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

    方法四:AsyncTask

private void method4() {
    //UI线程中执行
    new LoadTask().execute("www.91dota.com");
}
private class LoadTask extends AsyncTask {
    protected void onPostExecute(String result) {
        myText.setText(result); //得到来自网络的信息刷新页面
    }
    protected String doInBackground(Object[] objects) {
        return "......";//后台耗时操作
    }
}

===========================》

附上代码和布局

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private TextView myText;
    private Handler mHadndler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            myText.setText("收到消息啦..." + msg.what);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myText = findViewById(R.id.myTextView);
    }

    /**
     * 方法一:Handler
     */
    private void method1() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    //耗时操作
                    connectNet();
                    //向Handler发送消息
                    mHadndler.sendEmptyMessage(111);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }

    /**
     * 方法二:通过View.post(Runnable)
     */
    private void method2() {
        myText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            //耗时操作
                            connectNet();
                            myText.post(new Runnable() {
                                @Override
                                public void run() {
                                    myText.setText("联网结束,更新UI数据");
                                }
                            });
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        });
    }

    /**
     * 方法三:Activity.runOnUiThread(Runnable )
     */
    private void method3() {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                try {
                    //耗时操作
                    connectNet();
                    myText.setText("runOnUiThread...");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * 方法四:AsyncTask
     */
    private void method4() {
        //UI线程中执行
        new LoadTask().execute("www.91dota.com");

    }
    private class LoadTask extends AsyncTask {
        protected void onPostExecute(String result) {
            myText.setText(result); //得到来自网络的信息刷新页面
        }
        protected String doInBackground(Object[] objects) {
            return "......";//后台耗时操作
        }
    }

    private void connectNet() throws InterruptedException {
        Thread.sleep(2000);
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/myTextView"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_margin="10dp"
        android:background="#dea"
        android:gravity="center"
        android:text="Hello World!" />

</LinearLayout>

参考:http://www.it165.net

原文地址:https://www.cnblogs.com/jooy/p/8999200.html

时间: 2024-10-10 15:23:46

Android 操作UI线程的一些方法的相关文章

Android中UI线程与后台线程交互设计的5种方法

我想关于这个话题已经有很多前辈讨论过了.今天算是一次学习总结吧. 在android的设计思想中,为了确保用户顺滑的操作体验.一 些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须要重新开启一个后台线程运行这些任务.然而,往往这些任务最终又会直接或者 间接的需要访问和控制UI控件.例如访问网络获取数据,然后需要将这些数据处理显示出来.就出现了上面所说的情况.原本这是在正常不过的现象了,但是 android规定除了UI线程外,其他线程都不可以对那些UI控件访问和操控.为了解决

Android非UI线程更新UI的几种方法

Android用于实现非UI线程与UI线程的交互方法如下: 1.Handler 2.Activity.runOnUIThread(Runnable) 3.View.Post(Runnable) 4.View.PostDelayed(Runnabe,long) 5.AsyncTask

Android 更新UI的两种方法——handler和runOnUiThread() - $firecat的代码足迹$ - 博客频道 - CSDN.NET

文章来源:http://www.2cto.com/kf/201302/190591.html Android 更新UI的两种方法——handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread th

探讨android更新UI的几种方法(转)

作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现,自己越来越消极怠工,只是在无意义的敲代码,敲的还是网上抄来的代码,如果不行,继续找. 这就是项目进度没有规划好而导致的. 最近在做有关蓝牙的项目,一开始的进度都安排得很顺利,但是因为测试需要两部手机,而且还要是android手机,暑假已经开始了,同学们都回家了,加上我手机的蓝牙坏了,导致我的进度严重被打乱!而

Android 更新UI的两种方法——handler和runOnUiThread(

Android 更新UI的两种方法——handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views

探讨android更新UI的几种方法

作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现,自己越来越消极怠工,只是在无意义的敲代码,敲的还是网上抄来的代码,如果不行,继续找. 这就是项目进度没有规划好而导致的. 最近在做有关蓝牙的项目,一开始的进度都安排得很顺利,但是因为测试需要两部手机,而且还要是android手机,暑假已经开始了,同学们都回家了,加上我手机的蓝牙坏了,导致我的进度严重被打乱!而

【转】探讨android更新UI的几种方法----不错

原文网址:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因为现实是残酷的,就算一开始的时间和精力非常充足,也会随着项目的推进而逐步消磨殆尽.我们会发现,自己越来越消极怠工,只是在无意义的敲代码,敲的还是网上抄来的代码,如果不行,继续找. 这就是项目进度没有规划好而导致的. 最近在做有关蓝牙的项目,一开始的进度都安排得很顺利,但是因为测试需要两部手机,而且还

Android 非UI线程中更新UI

Android 非UI线程中更新UI runOnUiThread(new Runnable() { public void run() { onDown(null); } });

【转载】Android中UI线程与后台线程交互设计的5种方法

原帖地址:http://www.cr173.com/html/19165_1.html 在android的设计思想中,为了确保用户顺滑的操作体验.一些耗时的任务不能够在UI线程中运行,像访问网络就属于这类任务.因此我们必须要重新开启一个后台线程运行这些任务.然而,往往这些任务最终又会直接或者间接的需要访问和控制UI控件.例如访问网络获取数据,然后需要将这些数据处理显示出来.就出现了上面所说的情况.原本这是在正常不过的现象了,但是android规定除了UI线程外,其他线程都不可以对那些UI控件访问