首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

最近学习Android的时候遇到些奇怪的有关问题,版本3.N和4.N使用不了HttpClient功能

2013-08-01 
最近学习Android的时候遇到些奇怪的问题,版本3.N和4.N使用不了HttpClient功能我最近开发了一个Android项目

最近学习Android的时候遇到些奇怪的问题,版本3.N和4.N使用不了HttpClient功能
我最近开发了一个Android项目,但只能用于2.N的平台上,而3.N和4.N都不能使用,我建的项目是最小支持2.N,目标4.2.2,最终编译也是4.2.2,配置文件也设置了权限,安装没有问题,就是使用不了Android的SDK的HttpClient这个功能,执行到execute就会出错!希望各位牛人能提供点意见!
AndroidManifest.xml

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

package UtilityBundle;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.params.HttpClientParams;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

import android.util.Log;

public class WcfHelper
{
private static String UrlString = "http://";
private static final String UTag = "/";
private static final String USvcSuffix = ".svc";
/*
 * http://ServerAddress/SvcFileName/ServerMethod?Param1=Val1&Param2=Val2
 * @param:
 * ServerAddress:192.168.1.198/ACWcfService


 * SvcFileName:AccountService
 * ServerMethod:SendMessageByPost1
 * MethodParam:{"p1","p2"}
 * ParamVal:{"v1","v2"}
 */
public static String GetWcfServiceUtility(String ServerAddress,
String SvcFileName, String ServerMethod, String[] MethodParam,
String[] ParamVal)
{
String UrlParam = null;
if ((MethodParam.length > 1))
{
for (int i = 0; i < MethodParam.length; i++)
{
if (i == 0)
{
UrlParam = "?" + MethodParam[i] + "=" + ParamVal[i];
}
else
{
UrlParam = UrlParam + "&" + MethodParam[i] + "="
+ ParamVal[i];
}
}
}
else if (MethodParam.length == 1)
{
UrlParam = "?" + MethodParam[0] + "=" + ParamVal[0];
}
UrlString = UrlString + ServerAddress + UTag + SvcFileName + USvcSuffix + UTag + ServerMethod
+ UrlParam;
String Rslt = null;
try
{
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(UrlString);
HttpResponse response = client.execute(request);
Rslt = EntityUtils.toString(response.getEntity());
}
catch (Exception e)
{
Rslt = null;
}
UrlString = "http://";
return Rslt;
}

/*
 * http://192.168.1.198/ACWcfService/AccountService.svc/SendMessageByPost1
 * @param:
 * ServerAddress:192.168.1.198/ACWcfService
 * SvcFileName:AccountService
 * ServerMethod:SendMessageByPost1
 * MethodParam:{"p1","p2"}
 * ParamVal:{"v1","v2"}
 */
public static String PostWcfServiceUtility(String ServerAddress,
String SvcFileName, String ServerMethod, String[] MethodParam,
String[] ParamVal)
{
String Rslt = null;
try
{
// 创建 HttpParams 以用来设置 HTTP 参数(这一部分不是必需的)   
HttpParams params = new BasicHttpParams();   
// 设置连接超时和 Socket 超时,以及 Socket 缓存大小   
HttpConnectionParams.setConnectionTimeout(params, 20 * 1000);   
HttpConnectionParams.setSoTimeout(params, 20 * 1000);   


HttpConnectionParams.setSocketBufferSize(params, 8192); 
// 设置重定向,缺省为true   
HttpClientParams.setRedirecting(params, true);   
  
HttpClient client = new DefaultHttpClient(params);
UrlString = UrlString + ServerAddress + UTag + SvcFileName + USvcSuffix + UTag
+ ServerMethod;
HttpPost request = new HttpPost(UrlString);
JSONObject p = new JSONObject();
for (int i = 0; i < MethodParam.length; i++)
{
p.put(MethodParam[i], ParamVal[i]);
}
request.setEntity(new StringEntity(p.toString()));
request.setHeader(HTTP.CONTENT_TYPE, "application/json");
HttpResponse response = client.execute(request);
Rslt = EntityUtils.toString(response.getEntity());
}
catch (Exception e)
{
Rslt = null;
}
UrlString = "http://";
return Rslt;
}

public static String HttpURLPost(String ServerAddress,
String SvcFileName, String ServerMethod, String[] MethodParam,
String[] ParamVal)
{
String Rslt = StringHelper.Empty();
HttpURLConnection urlCnn = null;
        InputStream inputStream = null;
        try {
        UrlString = UrlString + ServerAddress + UTag + SvcFileName + USvcSuffix + UTag
+ ServerMethod;
            URL url = new URL(UrlString);
            urlCnn = (HttpURLConnection) url.openConnection();
urlCnn.setDoOutput(true);
urlCnn.setDoInput(true);
urlCnn.setRequestMethod("POST");
urlCnn.setUseCaches(false);
urlCnn.setConnectTimeout(10000);
urlCnn.setReadTimeout(8000);
urlCnn.setRequestProperty("Content-Type", "text/json");
urlCnn.setRequestProperty("Accept-Charset", "utf-8");
urlCnn.setRequestProperty("contentType", "utf-8");
            OutputStream os = urlCnn.getOutputStream();

            String param = "one=valueGoesHere";

            os.write(param.getBytes());
            inputStream = urlCnn.getInputStream();


            byte[] buffer = null;
            if(urlCnn.getResponseCode() == 200){
                buffer = new byte[1024];
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                int len;
                while ((len = inputStream.read(buffer)) != -1)
                {
                    out.write(buffer, 0, len);
                }
                buffer = out.toByteArray();
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.e("sjr","Network-error");
        }
        finally{
            try {
                if(inputStream != null){
                    inputStream.close();
                }
                if(urlCnn != null){
                urlCnn.disconnect();
                }
            } catch (IOException e) {
                e.printStackTrace();
                Log.e("sjr","InvokeWebServiceHelper类中释放资源出错");


            }
        }
        return Rslt;
    }
}

HttpClient Android?HttpClient
[解决办法]
把错误信息贴上来再看这个额

贴这么一大块东西上来,眼睛都看花了,好歹注一下是哪里出错的

关于http,如果版本上出现问题看一下你是不是在主线程中请求数据的,如果是,放到子线程,android4.0以后的版本不允许在主线程访问网络(3.0以上的是平板的,我不是很清楚)
查一查是不是这个原因吧,
如果不是,把详细的错误信息贴上来
[解决办法]
赞同1楼的观点   报错稳稳的在主线程执行网络请求了
[解决办法]
应该就是楼主所说的,在主线程访问网络的原因,在3.0之前是允许的,3.0开始就会报错
[解决办法]
错误信息贴出来  还有就是贴下面代码试试 在访问网络前 把判断4.0降为3.0就行  以前判断的为4.0就进入
// 如果本系统为4.0以上(Build.VERSION_CODES.ICE_CREAM_SANDWICH为android4.0)
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
// 详见StrictMode文档
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads().detectDiskWrites().detectNetwork()
.penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectLeakedSqlLiteObjects().detectLeakedClosableObjects()
.penaltyLog().penaltyDeath().build());
}

[解决办法]
还是把网络访问的部分放到主线程以外去做吧。

热点排行