一个折腾很久的支付宝支付的问题【多线程问题】
2016-05-24 19:16
288 查看
<span style="white-space:pre"> </span>/** * call alipay sdk pay. 调用SDK支付 * */ public void pay(View v) { final String payInfo = Service.service.getAlipayRequest(); Toast.makeText(PayDemoActivity.this, payInfo, Toast.LENGTH_SHORT).show(); Runnable payRunnable = new Runnable() { @Override public void run() { // 构造PayTask 对象 PayTask alipay = new PayTask(PayDemoActivity.this); // 调用支付接口,获取支付结果 String result = alipay.pay(payInfo); Message msg = new Message(); msg.what = SDK_PAY_FLAG; msg.obj = result; mHandler.sendMessage(msg); } }; // 必须异步调用 Thread payThread = new Thread(payRunnable); payThread.start(); }
<pre name="code" class="java">Service.service.getAlipayRequest:public String getAlipayRequest(){try{URL url = new URL(path);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");if(conn.getResponseCode() == 200){InputStream inStream = conn.getInputStream();byte[] data = StreamTool.read(inStream);String html = new String(data, "UTF-8");return html;}}catch(Exception e){}return "";}发现一个很重要的问题,支付宝的请求发起放在子线程中,获取请求串的动作放在服务端,在客户端通过URLConnection请求。如果我们把这个请求放在主线程中,可能由于这个操作比较耗时造成支付线程的payInfo为空。那么应该将请求的操作放在支付线程中,请求完成之后才向支付宝发起请求。如下:<span> </span>/*** call alipay sdk pay. 调用SDK支付**/public void pay(View v) {Runnable payRunnable = new Runnable() {@Overridepublic void run() {
<pre name="code" class="java"><span style="white-space:pre"> </span>final String payInfo = Service.service.getAlipayRequest();<span style="white-space:pre"> </span>Toast.makeText(PayDemoActivity.this, payInfo,Toast.LENGTH_SHORT).show();// 构造PayTask 对象PayTask alipay = new PayTask(PayDemoActivity.this);// 调用支付接口,获取支付结果String result = alipay.pay(payInfo);Message msg = new Message();msg.what = SDK_PAY_FLAG;msg.obj = result;mHandler.sendMessage(msg);}};// 必须异步调用ThreadpayThread = new Thread(payRunnable);payThread.start();}此例子充分说明,在android或其他的开发中,多线程问题永远是需要特别注意的问题,尤其是需要有序的操作,需要使用线程的同步和通信技术,否则造成数据的不正确。
相关文章推荐
- unity里pbr技术及材质流程与材质制作实践
- ARM汇编 MOV PC,LR
- Linux安装—IP设置
- 开源项目实现多线程下载
- Python Tricks(十三)—— 欧几里得算法
- Design之CoordinatorLayout+TabLayout+RecyclerView&CollapsingToolbarLayout
- centos下配置nginx支持php
- Python读取中文txt文件错误:UnicodeEncodeError: 'gbk' codec can't encode character
- Linux内核概述
- C笔记
- 【JZOJ 3397】 雨天的尾巴 线段树合并
- 蓝桥杯--2N皇后
- apollo mqtt client instance
- Apache Cordova-Android框架原理研究笔记 I
- C++动态库于静态库区别
- ReentrantReadWriteLock锁例子
- sdut 2609 A-Number and B-Number
- [BZOJ1297][SCOI2009]迷路(拆点+矩阵乘法)
- springMVC Freemarker 取map值
- UIImagePickerController(图片选择器)