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

<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() {

			@Override
			public 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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值