android的多线程操作(一)

“By default, all components of the same application run in the same process and thread (called the "main" thread).”

         在通常的情况下,android应用程序都是运行在单一进程与线程之中的。这个线程就是“main”线程,也常被称为”UI线程”。

         但是很多情况下我们的应用都可能会执行一些比较耗时的操作,例如获取一个网络的资源、一个文件的传输。如果我们把这些操作放在主线程。就会使线程阻塞(block),如果长时间的阻塞,我们还会看到臭名昭著的“应用程序失去响应”的对话框。所以,为了避免这和情况,我们首先想到的就是多开一个线程出来执行这些操作。但是,android的UI toolkit并不是线程安全(thread-safe)的。android系统对线程的要求是这样的:

  1. Do not block the UI thread
  2. Do not access the Android UI toolkit from outside the UI thread
  1. 不要阻塞UI线程。
  2. 不要在非UI线程中操作UI组件。

所以假如我们执行类似这样的代码:

new Thread() {
    public void run() {
        tv_content.setText("abc");
    };
}.start();

就会在运行的时候报错。因为它违反了第二条约定。

 

anroid系统还是给我们提供了多种的解决方法的。

首先来看看第一类:

(1)       让操作在UI线程中运行(不让我在其实线程更新,那就在UI线程中更新呗!):

我们可以调用以下方法:

所以我们上边的代码改成这样就没问题了:

new Thread() {
    public void run() {
        runOnUiThread(new Runnable() {
            public void run() {
                tv_content.setText("abc");
            }
        });
    };
}.start();

这种方法虽然简单,可是代码的逻辑性并不好。如果是更复杂的操作,这种代码看起来是很“恶心的”。所以,这个方法仅在一些简单操作上才推荐使用。

 

(2)       使用AsyncTask的子类来实现异步操作:

AsyncTask是一个抽象类,专门用来处理一些异步操作。

这个类中我们经常使用的方法有三个:

protected void onPreExecute()

protected abstract Result doInBackground(Params... params)

protected void onProgressUpdate(Progress... values)

protected void onPostExecute(Result result)

这四个方法对应着三个过程:执行前à执行中à执行完。

在执行的过程中,我们可以自己更新进度,使用方法:

protected final void publishProgress(Progress... values)

其中onPreExecute()、onProgressUpdate()和onPostExcute()这三个方法是在UI线程中执行的。doInBackground()方法是在其它线程运行的。

下面是一个demo:

 

public class MainActivity_Asyn extends Activity {
    private Button btn_get;
    private TextView tv_content;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_get = (Button) findViewById(R.id.btn_get);
        tv_content = (TextView) findViewById(R.id.tv_content);
        btn_get.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                new DownloadString().execute("http:www.baidu.com");
            }
        });
    }

    private class DownloadString extends AsyncTask<String, String, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            tv_content.setText("开始获取");
        }

        @Override
        protected String doInBackground(String... params) {
            HttpClient client = new DefaultHttpClient();
            HttpGet get = new HttpGet(params[0]);
            StringBuilder sb = new StringBuilder();
            try {
                publishProgress("下载 中...");
                HttpResponse response = client.execute(get);
                InputStream is = response.getEntity().getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));
                String buffer = null;
                while ((buffer = reader.readLine()) != null) {
                    sb.append(buffer);
                }
            }
            catch (Exception e) {
                e.printStackTrace();
            }
            return sb.toString();
        }
        
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
            tv_content.setText(values[0]);
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            tv_content.setText(result);
        }

    }
}

从这个demo 可以看出AsyncTask的大概执行过程。

这篇博文也是讲AsyncTask的,可以看看。

http://www.cnblogs.com/dawei/archive/2011/04/18/2019903.html

 

未完待续……

转载于:https://www.cnblogs.com/yjiyjige/archive/2012/09/05/2671722.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android多线程是指在Android应用程序中同时执行多个线程的技术。在Android开发中,多线程主要用于处理耗时操作,以避免阻塞主线程(也称为UI线程),从而提高应用的响应性能。 在Android中,常用的多线程技术包括以下几种: 1. AsyncTask:这是一种轻量级的异步任务类,适用于较简单的后台任务。它封装了线程的管理和与UI线程的交互,可以在UI线程中执行一些耗时操作,如网络请求、数据库查询等。 2. HandlerThread:这是一种带有消息队列的线程类。它可以用来创建一个后台线程,并通过Handler与UI线程进行通信。通常用于执行需要长时间运行的任务或周期性任务。 3. ThreadPoolExecutor:这是一个线程池类,可以管理多个线程并发执行任务。通过使用线程池,可以有效地重用线程、控制并发数量、管理线程的生命周期等。 4. IntentService:这是一种继承自Service的特殊服务类,用于执行后台任务。它会自动创建工作线程来处理任务,并在任务完成后自动停止。 5. RxJava:这是一个响应式编程库,可以简化多线程编程。通过使用观察者模式和链式调用,可以方便地实现异步操作和线程切换。 除了以上几种常用的多线程技术,还可以使用Java原生的Thread类来创建和管理线程,但需要注意在UI线程中的使用,避免阻塞UI的响应。 在使用多线程时,需要注意线程安全性,避免出现数据竞争和死锁等问题。同时,也要合理地管理线程的生命周期,确保在不需要时及时停止和释放资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值