×
Namespaces

Variants
Actions

Tantalum跨平台库介绍

From Nokia Developer Wiki
Jump to: navigation, search
WP Metro Icon Chinese.png
Article Metadata

兼容于
文章
Amazing1100 在 16 Aug 2013 创建
最后由 hamishwillee 在 26 Aug 2013 编辑

介绍

Tantalum 是一个跨平台的Java库,使用它可以以最精简,便捷的方式实现基于网络,并发控制的应用,主要功能点包括:

  • 线程池
  • Http网络连接及缓存
  • 登陆及Cooky
  • Json及XML解析

使用它,另外一个最大的优点就是可以通过这个轻量级的跨平台库的封装,你可以轻松的在Asha和Android平台之间实现两个平台的运行一套代码。


使用前提(初始化及关闭库)

你需要通过如下代码来实现Tantalum库的初始化工作,在Asha Java应用中,一般建议在startApp函数中执行此初始化工作。

PlatformUtils.setProgram()
PlatformUtils.getInstance().setProgram(this, 3);

上面的代码中,第一个参数为对象类型,Tantalum 将在运行时获取真实的类型。 在Android平台中,第一个参数将会是你的Activity实例,第二参数是工作线程的数量。 在Asha平台中,可选的线程数是在2至4范围内。


通过Tantalum 库,你可以在Asha或者Android平台通过调用:

PlatformUtils.shutdown(boolean unconditional, String reason)

随时关闭你的程序,如果你设置 参数unconditional为false,那么关闭操作将会等到当前任务执行完毕后促发。如果unconditional为true,那么后台任务将会在3秒后被终端。



功能1:精巧的线程模型

Tantalum 的线程模型主要原理是它将会维护一个后台操作的队列,你可以该队列中添加多个后台网络操作。 改队列被多个线程使用执行,但是这里队列是进行同步并发保护的,所有不用担心并发问题。


把一段代码操作添加进队列,或则 “forking”它到另一个线程执行,这些操作都是通过调用:

Worker.fork(Workable workable, int priority)

完成的,参数优先级有如下可选项:

  • Worker.NORMAL_PRIORITY – 默认优先级,操作将会被添加到队列末尾,也就说会在前面的所有操作完成后执行。
  • Worker.HIGH_PRIORITY – 操作将会被添加到队列最前端,将会有下一个可用的工作线程执行,一般而言,我们需要对结果会引起UI改变的操作设置高的优先级。
  • Worker.LOW_PRIORITY – 操作将会被添加到另外一个队列,仅当主队列中没有元素时,它才会被执行。并且对于多个LOW_PRIORITY 的任务,只会使用一个线程来执行它,不会多个线程并发执行。


大多数操作都是来自主任务队列,并且在多个线程中并发执行。队列中多个任务的执行顺序是可以预测的,但是同时也不是绝对的一定的。

Worker.forkSerial() 被用来授权在一个线程中顺序化的执行所有任务。 Worker.forkShutdownTask() 用来在添加诸如 程序退出前自动执行的 关闭资源,各种session等任务。



最简单的能够被添加进队列的任务就是实现接口Workable的对象,但是这种对象对应的任务是无状态的,无任务完成通知的简单的实现。

public interface Workable {
/**
* Do a task on a background thread, possibly returning a result
* for asynchronous pipeline operations.
* @param in
*/

public Object exec(Object in);
}


使用方式一般如下:

Worker.fork(new Workable() {
public Object exec(Object in) {
// Do something on a background Worker thread
}
});


通过实现Workable 接口我们可以轻松的指导有哪些操作时属于后台执行的,但是直接使用Workable 还是有功能上的限制和不足。具体任务通常是通过你的代码来扩展,同时返回异步的结果。 唯一使用场景将会在后面的“fork-join” 那一块进行讨论。



每个任务有一个内部状态,这个状态的值会根据任务的执行进度而变化,这些状态值通常有以下:

  • Task.READY – 初始状态
  • Task.EXEC_PENDING – 任务处于队列,但是还未被一个工作线程执行。
  • Task.EXEC_STARTED – 工作线程开始执行该任务 exec() 方法被运行.
  • Task.EXEC_FINISHED – Workable 对应的任务执行完成.
  • Task.UI_RUN_FINISHED – UITask}} 类型的任务被执行完毕.
  • Task.CANCELED – 任务呗取消,这时 onCancelled() 方法在UI线程中被调用
  • Task.EXCEPTION – 运行异常,这时 onCancelled() 方法在UI线程中被调用

由于任务管理机制将负责任务状态的改变,以及进行错误,异常的处理,因此你不能够直接重写exec() 函数,转而,你可以在 doInBackground() 方法中实现你的代码。

Worker.fork(new Task() {
public Object doInBackground(Object in) {
// Do something on a background Worker thread
}
}


使用方式:

(new Task() {
public Object doInBackground(Object in) {
// Do something on a background Worker thread
}
}).fork();


当你想使用任务的返回结果是,你也可以方便的从Task中获取,这也是UITask 扩展的原因:

(new UITask() {
public Object doInBackground(Object in) {
// Do something on a background Worker thread
return Image.createImage(in); // Task stores this “result”
}
 
public void onPostExecute(Object result) {
// Do something on the UI thread using the Image “result”
}
}).fork();

你可以能注意到,每一个任务接收一个输入,同时提供一个输出。这是异步任务的一种常用的飞,方便的流程。

This page was last modified on 26 August 2013, at 07:19.
149 page views in the last 30 days.
×