banxitan

统计

留言簿(2)

阅读排行榜

评论排行榜

2013年5月21日 #

Android Activity MainThread 中不能执行http通信解决办法

今天在做离线文件传输时。用HTTP上传文件。程序一运行 报如下的错误
android.os.NetworkOnMainThreadException

原因是Google从3开始,强制默认禁止UI主线程发起通信请求 

解决办法: 

把通信的代码转移到子线程里去做, 比较靠谱的是new一个AyncTask,在里面做通信

                          有几个细节性的问题是,

                                第一, 一般原有通信的代码都是共通的API, 被许多个Activity调用, 一个良好的修改方法是在共通API里面new AyncTask

                               第二, 通信的API一般来说都是同步的, 你通信,然后画面主线程需要堵塞住,等待API的通信结果,再决定下面的业务逻辑的走向。

所以,这块可以采取 AyncTask.get(), 让主线程堵塞,直到通信结束。 当然,如果你需要将通信异步的话, 可以用Handler机制来解决


具体调用代码如下:HTTP异

步请求

package com.qqtech.ucstar.utils;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.AsyncTask;

public class HttpReqTask extends AsyncTask<Object, Object, HttpResponse> {

@Override
protected HttpResponse doInBackground(Object arg0) {
String fileUploadUrl
= (String) arg0[0];
String streamid
= (String) arg0[1];
File file
= (File) arg0[2];
//boolean paramBoolean = Boolean.parseBoolean((String) arg0[3]);
//String paramString3 = (String) arg0[4];
HttpClient localHttpClient = new DefaultHttpClient();
//String str1 = "fileName";
File localFile = file;
try {
if ((localFile == null) || (!localFile.exists()))
throw new IOException("文件不存在:" + localFile);
}
catch (IOException e1) {
e1.printStackTrace();
}

HttpPost localPostMethod
= new HttpPost(fileUploadUrl+"?streamid="+streamid+"&fileencode=UTF-8");
//MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,null, Charset.forName("UTF-8"));
try {
FileBody bin
= new FileBody(file);
reqEntity.addPart(
"file", bin);
localPostMethod.setEntity(reqEntity);
HttpResponse response
= localHttpClient.execute(localPostMethod);
return response;
}
catch (Exception e) {
e.printStackTrace();
}

return null;
}


}



调用代码如下:


Object[] param = new Object[5];
     param[0] = answer.getUploadURL();
     param[1] = answer.getStreamid();
     param[2] = new File(answer.getFileURL());
     param[3] = "false";
     param[4] = "";
     AsyncTask res = new HttpReqTask().execute(param);
     HttpResponse rep = null;
     rep = (HttpResponse) res.get();
     if (rep.getStatusLine().getStatusCode() == 200) {
      System.out.println("文件上传成功");
     }else{
      System.out.println("文件上传失败");
     }
    }



posted @ 2013-07-11 10:51 MikyTan 阅读(1081) | 评论 (0)编辑 收藏

修改模拟器DNS方法

今天在做手机终端开发时,发现连上域名服务器老是连不上,而直接用IP连接是OK的,初步怀凝是DNS问题引起来,经查相关的资料,现记录如下:

Android模拟器默认的地址是10.0.2.3,默认的DNS也是10.0.2.3,而一般电脑的IP都是192.168.1.100之类的,不在同一个网段。所以就会出现电脑可以上网但是模拟器不能上网的情况。其实设置方法很简单,只要把模拟器的默认DNS设置成电脑的DNS地址即可。
第一步:用系统的命令进入Android开发包的tools目录
 cd X:\...\android-sdk-windows\tool
第二布:使用adb的shell,确认系统的各项属性
adb shell
getprop 
getprop会列出系统当前的各项属性
第三步:得到模拟器的DNS地址
在结果里可以看到:
[net.dns1]: [10.0.2.3]
[net.dns2]: [10.0.2.4]
[net.dns3]: [10.0.2.5]
[net.dns4]: [10.0.2.6]
第四步:把dns改成我们自己的DNS
setprop net.dns1 192.168.1.1

posted @ 2013-06-04 20:24 MikyTan 阅读(1265) | 评论 (0)编辑 收藏

JAVA 连接 ORCLE RAC连接URL串

连接的URL串

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=vip1)(PORT

=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=vip2)(PORT=1521))(LOAD_BALANCE=yes)(FAILOVER=

on))(CONNECT_DATA=(SERVICE_NAME=gs)))


posted @ 2013-05-21 16:48 MikyTan 阅读(246) | 评论 (0)编辑 收藏