Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

Tantalum跨平台库介绍

From 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 04:19.
380 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×