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

来源:互联网 发布:网上上课软件免费 编辑:程序博客网 时间:2024/05/16 06:49
<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() {@Overridepublic 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);}};// 必须异步调用Thread payThread = new Thread(payRunnable);payThread.start();}

此例子充分说明,在android或其他的开发中,多线程问题永远是需要特别注意的问题,尤其是需要有序的操作,需要使用线程的同步和通信技术,否则造成数据的不正确。

0 0
原创粉丝点击