接上文

前文中的遗留问题

对于Java多线程的理解,我曾经只局限于实现Runnable接口或者继承Thread类。然后重写run()方法。最后start()调用就算完事,可是一旦涉及死锁以及对共享资源的訪问和随时监控线程的状态和运行顺序和线程返回值等就不行了。

 

Callable 和 Future 简单介绍

Callable接口代表一段能够调用并返回结果的代码;Future接口表示是运行异步任务时的状态、返回值等信息。所以说Callable用于产生结果,Future用于获取结果。

 

1. Callable

Callable 是一个接口,它只包括一个call()方法。Callable是一个返回结果而且可能抛出异常的任务。

为了便于理解。我们能够将Callable比作一个Runnable接口,而Callable的call()方法则相似于Runnable的run()方法。

Callable的源代码例如以下:

<span style="font-size:18px;">publi cinterface Callable<V> {
V call() throws Exception;
}</span>

2. Future

Future 是一个接口。它用于表示异步计算的结果。提供了检查计算是否完毕的方法,以等待计算的完毕,并获取计算的结果。

Future的源代码例如以下:

<span style="font-size:18px;">public interface Future<V> {
// 试图取消对此任务的运行。
boolean cancel(boolean mayInterruptIfRunning)
//假设在任务正常完毕前将其取消。则返回 true。
boolean isCancelled()
//假设任务已完毕。则返回 true。
boolean isDone()
//如有必要,等待计算完毕,然后获取其结果。
V get() throws InterruptedException,ExecutionException;
//如有必要,最多等待为使计算完毕所给定的时间之后。获取其结果(假设结果可用)。
V get(long timeout, TimeUnitunit)
throws InterruptedException,ExecutionException, TimeoutException;
}</span>

 

演示样例的Callable和Future的基本使用方法

我们先通过一个演示样例看看Callable和Future的基本使用方法

<span style="font-size:18px;">importjava.util.concurrent.Callable;
importjava.util.concurrent.Future;
importjava.util.concurrent.Executors;
importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.ExecutionException; classMyCallable implements Callable { @Override
public Integer call() throws Exception {
int sum = 0;
// 运行任务
for (int i=0; i<100; i++)
sum += i;
//return sum;
return Integer.valueOf(sum);
}
} publicclass CallableTest1 { public static void main(String[] args)
throws ExecutionException,InterruptedException{
//创建一个线程池
ExecutorService pool =Executors.newSingleThreadExecutor();
//创建有返回值的任务
Callable c1 = new MyCallable();
//运行任务并获取Future对象
Future f1 = pool.submit(c1);
// 输出结果
System.out.println(f1.get());
//关闭线程池
pool.shutdown();
}
}</span>

运行结果:

4950

 

结果说明:

在主线程main中,通过newSingleThreadExecutor()新建一个线程池。

接着创建Callable对象c1,然后再通过pool.submit(c1)将c1提交到线程池中进行处理,而且将返回的结果保存到Future对象f1中。然后,我们通过f1.get()获取Callable中保存的结果;最后通过pool.shutdown()关闭线程池。

 

回到主题:调用查询手机号归属地的webservice

事实上通过上面的简单样例。全然能够将通过Runnable接口或者Thread类实现的线程代码。改动成Callable和Future实现的线程。

<span style="font-size:18px;">public class Main Activity extends Activity { 

    public static final String TAG ="webService_pj";

    private EditText phoneSecEditText;
private TextView resultView;
private Button queryButton; @Override
public void onCreate(BundlesavedInstanceState) { // StrictMode.setThreadPolicy(newStrictMode.ThreadPolicy.Builder()
// .detectDiskReads().detectDiskWrites().detectNetwork()
// .penaltyLog().build());
//
// StrictMode.setVmPolicy(newStrictMode.VmPolicy.Builder()
// .detectLeakedSqlLiteObjects().penaltyLog().penaltyDeath()
// .build()); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); phoneSecEditText = (EditText)findViewById(R.id.phone_sec);
resultView = (TextView)findViewById(R.id.result_text);
queryButton = (Button)findViewById(R.id.query_btn); queryButton.setOnClickListener(newOnClickListener() {
@Override
public void onClick(View v) { Log.i(TAG,"MainActivity线程ID:"+Thread.currentThread().getId()); // 手机号码(段)
String phoneSec =phoneSecEditText.getText().toString().trim();
// 简单推断用户输入的手机号码(段)是否合法
if("".equals(phoneSec) || phoneSec.length() < 7) {
// 给出错误提示
phoneSecEditText.setError("您输入的手机号码(段)有误!");
phoneSecEditText.requestFocus();
// 将显示查询结果的TextView清空
resultView.setText("");
return;
} // 命名空间
String nameSpace = "http://WebXml.com.cn/";
// 调用的方法名称
String methodName ="getMobileCodeInfo";
// EndPoint
String endPoint = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
// SOAP Action
String soapAction = "http://WebXml.com.cn/getMobileCodeInfo";
// method params and values
ArrayList<String> params= new ArrayList<String>();
ArrayList<Object> vals =new ArrayList<Object>();
params.add("mobileCode");
params.add("userId");
vals.add(phoneSec);
vals.add(""); //通过Callable和Future创建线程。调用WebService
//创建有返回值的任务
CallableThread callable = newCallableThread(nameSpace,methodName,endPoint,soapAction,params,vals);
// 创建一个线程池
ExecutorServiceexecutor=Executors.newCachedThreadPool(); //运行任务并获取Future对象
Future<String>future = executor.submit(callable); try {
//输出结果
resultView.setText(future.get()); //关闭线程池
executor.shutdown();
}catch (InterruptedException e) {
e.printStackTrace();
}catch (ExecutionException e) {
e.printStackTrace();
} }
});
} private class CallableThread implementsCallable<String> {
private String nameSpace;
private String methodName;
private String endPoint;
private String soapAction;
private ArrayList<String> params;
private ArrayList<Object> vals; public CallableThread(StringnameSpace, String methodName,
StringendPoint, String soapAction, ArrayList<String> params,ArrayList<Object> vals){
this.nameSpace = nameSpace;
this.methodName = methodName;
this.endPoint = endPoint;
this.soapAction = soapAction;
this.params = params;
this.vals = vals;
} //须要实现Callable的Call方法
public String call() throws Exception{
// 这种方法的实现见上篇文章或者源代码
return getRemoteInfo(nameSpace,methodName, endPoint,
soapAction,params,vals);
}
} </span>

   

至此,Android调用Webservice就完美的完毕了。

源代码下载

http://download.csdn.net/detail/tcl_6666/7365341

Android平台调用Web Service:线程返回值的更多相关文章

  1. Android平台调用Web Service:演示样例

    近期在学习Android,随着移动设备的流行,当软件走上商业化的道路,为了争夺市场,肯定须要支持Android的,所以開始接触了Android,只是仅仅了解皮毛就好,由于我们要做管理者嘛,懂点Andr ...

  2. Android平台调用Web Service:螺纹的引入

    连接文本 剩下的问题 MainActivity的onCreate方法中假设没有有这段代码: // 强制在UI线程中操作 StrictMode.setThreadPolicy(new StrictMod ...

  3. andorid 平台调用Web Service , 图片传输

    今天学习了下android调用web service,进行图片传输 下面是代码详解: onActivityResult 方法在图片剪裁完成之后调用: protected void onActivity ...

  4. Web Service 中返回DataSet结果大小改进

    http://www.cnblogs.com/scottckt/archive/2012/11/10/2764496.html Web Service 中返回DataSet结果方法: 1)直接返回Da ...

  5. Web Service 中返回DataSet结果的几种方法

    Web Service 中返回DataSet结果的几种方法: 1)直接返回DataSet对象    特点:通常组件化的处理机制,不加任何修饰及处理:    优点:代码精减.易于处理,小数据量处理较快: ...

  6. Service#onStartCommand返回值解析

    Service#onStartCommand返回值解析 Service类有个生命周期方法叫onStartCommand,每次启动服务(startService)都会回调此方法.此方法的原型例如以下: ...

  7. Java多线程和并发(四),线程返回值获取方式和Callable接口

    目录 1.主线程等待法 2.使用Thread类的join()阻塞当前线程,等待子线程执行完毕 3.通过Callable接口实现:通过FutureTask Or线程池获取 四.线程返回值获取方式和Cal ...

  8. python获取线程返回值

    python获取线程返回值 前言 工作中的需求 将前端传过来的字符串信息通过算法转换成语音,并将语音文件返回回去 由于算法不是我写的,只需要调用即可,但是算法执行速度相当缓慢 我的优化思路是,将前端的 ...

  9. Web Service接口返回泛型的问题(System.InvalidCastException: 无法将类型为“System.Collections.Generic.List`1[System.String]”的对象强制转换为类型“System.String[]”)

    在使用C#写Web Service时遇到了个很奇怪的问题.返回值的类型是泛型(我用的是类似List<string>)的接口,测试时发现总是报什么无法转换为对象的错误,百思不得其解. 后来在 ...

随机推荐

  1. 一张图读懂PBN旁切转弯计算

    当DOC8168进入PBN章节以后,所有的保护区不再标注风螺旋的字母位置点.似乎ICAO已经有了精确计算的方法,只是没有告诉我们.沿着风螺旋的轨迹一路走来,切线与角度的换算方法想必已经相当熟悉了吧,这 ...

  2. 金山wps面经

    前言: 金山wps笔试是好久之前的了,忘记具体几号了.当时在华师参加的宣讲会,然后线下笔试通过了, 昨天(4月2号通知现场面试).今天是在华工酒店进行面试的,一二面一起进行的 一面: 1: 自我介绍 ...

  3. 四层和七层负载均衡的特点及常用负载均衡Nginx、Haproxy、LVS对比

    一.四层与七层负载均衡在原理上的区别 图示: 四层负载均衡与七层负载均衡在工作原理上的简单区别如下图: 概述: 1.四层负载均衡工作在OSI模型中的四层,即传输层.四层负载均衡只能根据报文中目标地址和 ...

  4. vb.net 发Mail

    Private Sub A1() '创建发件连接,根据你的发送邮箱的SMTP设置填充 Dim a As System.Net.Mail.Attachment Dim smtp As New Syste ...

  5. hash table (youtube 2)

    https://www.youtube.com/watch?v=jEdaduyLLqY

  6. 解决VM提示:VMware Workstation cannot connect to the virtual machine. Make sure you have rights to run the program, access all directories the program uses, and access all directories for temporary files.

    问题: 在开启虚拟机的时候报: VMware Workstation cannot connect to the virtual machine. Make sure you have rights ...

  7. 使用git连接本地和远程github

    使用git连接本地和远程github 网上很多github的流程比较乱,自己尝试整理了一下,主要是步骤较为清晰,如果有不清楚的可详细进行搜索对比 1. 申请和设置github https://gith ...

  8. linux shell脚本之-变量极速入门与进阶(2)

    1,$$:显示当前的进程id号 ghostwu@dev:~/linux/shell/how_to_use_var$ cat show_pid.sh #!/bin/bash echo $$ ghostw ...

  9. js之跑马灯广告

    目标效果:每过1秒重复把广告的第一个字符放到最后,达到动态跑马灯效果 代码如下: <!DOCTYPE html> <html lang="en"> < ...

  10. UED与UCD

    UED User Experience Design(用户体验设计),简称UED.UED是以用户为中心的一种设计手段,以用户需求为目标而进行的设计.设计过程注重以用户为中心,用户体验的概念从开发的最早 ...