codecamp

Android 在一个线程中执行一段特定的代码

编写:AllenZheng1991 - 原文:http://developer.android.com/training/multiple-threads/define-runnable.html

这一课向你展示了如何通过实现 Runnable接口得到一个能在重写的Runnable.run()方法中执行一段代码的单独的线程。另外你可以传递一个Runnable对象到另一个对象,然后这个对象可以把它附加到一个线程,并执行它。一个或多个执行特定操作的Runnable对象有时也被称为一个任务。

ThreadRunnable只是两个基本的线程类,通过他们能发挥的作用有限,但是他们是强大的Android线程类的基础类,例如Android中的HandlerThreadAsyncTaskIntentService都是以它们为基础。ThreadRunnable同时也是ThreadPoolExecutor类的基础。ThreadPoolExecutor类能自动管理线程和任务队列,甚至可以并行执行多个线程。

定义一个实现Runnable接口的类

直接了当的方法是通过实现Runnable接口去定义一个线程类。例如:

public class PhotoDecodeRunnable implements Runnable {
    ...
    @Override
    public void run() {
        /*
         * 把你想要在线程中执行的代码写在这里
         */
        ...
    }
    ...
}

实现run()方法

在一个类里,Runnable.run() 包含执行了的代码。通常在Runnable 中执行任何操作都是可以的,但需要记住的是,因为Runnable 不会在UI线程中运行,所以它不能直接更新UI对象,例如View 对象。为了与UI对象进行通信,你必须使用另一项技术,在与UI线程进行通信 这一课中我们会对其进行描述。

Runnable.run())方法的开始的地方通过调用参数为THREAD_PRIORITY_BACKGROUND 的Process.setThreadPriority()方法来设置线程使用的是后台运行优先级。 这个方法减少了通过Runnable创建的线程和和UI线程之间的资源竞争。

你还应该通过在Runnable 自身中调用Thread.currentThread()来存储一个引用到Runnable对象的线程。

下面这段代码展示了如何创建run()方法:

class PhotoDecodeRunnable implements Runnable {
...
    /*
     * 定义要在这个任务中执行的代码
     */
    @Override
    public void run() {
        // 把当前的线程变成后台执行的线程
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND);
        ...
        /*
         * 在PhotoTask实例中存储当前线程,以至于这个实例能中断这个线程
         */
        mPhotoTask.setImageDecodeThread(Thread.currentThread());
        ...
    }
...
}


Android 按需操控BroadcastReceiver
Android 为多线程创建管理器
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Android 后台任务

Android 使用CursorLoader在后台加载数据

Android 管理设备的唤醒状态

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }