您的位置:首页 > 其它

一个折腾很久的支付宝支付的问题【多线程问题】

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或其他的开发中,多线程问题永远是需要特别注意的问题,尤其是需要有序的操作,需要使用线程的同步和通信技术,否则造成数据的不正确。
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: