Andriod开发中的HTTP请求的问题

移动开发 码拜 10年前 (2015-05-11) 1266次浏览 0个评论

我几乎没有学过HTTP网络传输方面的知识,但由于最近的项目需求,需要用到百度的翻译API服务。
通过以下URL(附带传递参数),可以连接到百度翻译服务端,并返回一条标准JSON文本结果:
http://openapi.baidu.com/public/2.0/bmt/translate?client_id=9tdS6VTLddEQ8oo3lEk6w94M&q=today&from=auto&to=auto
我现在想在Android手机上访问这个URL,并且得到返回的JSON信息。
于是在网上找了一下HTTP编成的相关知识,写了如下的代码:

        String strUrl = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=9tdS6VTLddEQ8oo3lEk6w94M&q=today&from=auto&to=auto";
        String JSONtext = null;
        try{
            URL url = new URL(strUrl);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.connect();
            BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String line = null;
            while((line = reader.readLine()) != null){
                JSONtext = line;
            }
            reader.close();
            conn.disconnect();
        }catch (Exception e){
            e.printStackTrace();
        }
        if(JSONtext != null){
            TextView tv = (TextView)findViewById(R.id.tv);
            tv.setText(JSONtext);
        }

运行后发现执行到 conn.connect();这句就抛出异常了。
我在AndroidMainfest.xml里面也有加入下面的这句,但是还是在 conn.connect();这句就抛出异常:
<uses-permission android:name=”android.permission.INTERNET” />
找了很多文章,感觉代码都是长这样的,不知道应该如何解决。

如果有可能,希望能顺便介绍一下Android/JAVA 有关HTTP方面编成的相关知识(有找过一些,但是写的都很杂乱,希望能有个整理的好一点的),谢谢~

真的想解决问题就把异常信息拿出来溜溜,藏着干嘛使啊
json数据时后台返回来给客户端的。客户端只需要解析就好了.
还有就是楼主可以先给HttpURLConnection设置几个参数啊  比如请求方法,超时等。直接connect肯定会异常
贴出错误信息,
引用 1 楼 tcmakebest 的回复:

真的想解决问题就把异常信息拿出来溜溜,藏着干嘛使啊

我是用的AS,在调试模式,使用F8 StepOver,到catch语句完之后,显示的异常是””
但是当我继续StepOver的时候,到e.printStackTrace();这句,整个程序好像就死了,我看了console,也没见着输出错误信息,不知道什么情况。

引用 1 楼 tcmakebest 的回复:

真的想解决问题就把异常信息拿出来溜溜,藏着干嘛使啊

捕获的异常是:
android.os.NetworkOnMainThreadException
e.printStackTrace();执行后却没看见Console里有任何输出。。。

引用 3 楼 hjq2013 的回复:

贴出错误信息,

捕获的异常是:
android.os.NetworkOnMainThreadException
e.printStackTrace();执行后却没看见Console里有任何输出。。。

引用 2 楼 XiaToxic 的回复:

json数据时后台返回来给客户端的。客户端只需要解析就好了.
还有就是楼主可以先给HttpURLConnection设置几个参数啊  比如请求方法,超时等。直接connect肯定会异常

捕获的异常是:
android.os.NetworkOnMainThreadException
e.printStackTrace();执行后却没看见Console里有任何输出。。。

40分
引用 5 楼 NeetSonic 的回复:
Quote: 引用 3 楼 hjq2013 的回复:

贴出错误信息,

捕获的异常是:
android.os.NetworkOnMainThreadException
e.printStackTrace();执行后却没看见Console里有任何输出。。。

访问网络的操作,android不让放在主线程,将其放在分线程即可!

引用 7 楼 hjq2013 的回复:
Quote: 引用 5 楼 NeetSonic 的回复:
Quote: 引用 3 楼 hjq2013 的回复:

贴出错误信息,

捕获的异常是:
android.os.NetworkOnMainThreadException
e.printStackTrace();执行后却没看见Console里有任何输出。。。

访问网络的操作,android不让放在主线程,将其放在分线程即可!

网上找了下,原来使用强制忽略这个政策也是可以的:
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

不过你说的使用分线程访问网络应该是官方比较推荐的方法。

① 阅读服务端的接口文档
② 简要进行测试
③ 创建一个Activity
④ 使用AsyncHttpClient发请求【权限】
// ① 阅读服务端的接口文档
// http://api.yi18.net/news/list
// ② 简要进行测试
// ③ 创建一个Activity
// ④ 使用AsyncHttpClient发请求
AsyncHttpClient client = new AsyncHttpClient(); // 请求发送类

AsyncHttpResponseHandler responseHandler = new AsyncHttpResponseHandler() {
// 回调函数:成功
@Override
public void onSuccess(int statusCode, Header[] heads, byte[] bytes) {
super.onSuccess(statusCode, heads, bytes);

try {
String result = new String(bytes, “UTF-8”);
// System.out.println(result);

// ⑤ 转换成java对象gson
Gson gson = new Gson();

// gson.fromJson(数据, 类);
NoteResult data = gson.fromJson(result, NoteResult.class);

System.out.println(data);
showListView(data);

// ⑥ 布局/添加事件
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

}

// 回调函数:失败
@Override
public void onFailure(int statusCode, Header[] heads, byte[] bytes, Throwable e) {
super.onFailure(statusCode, heads, bytes, e);

}
};// 响应的接收器

String url = “http://api.yi18.net/news/list”;
client.get(url, responseHandler);

⑤ 转换成java对象gson
⑥ 布局/添加事件
private void showListView(final NoteResult data) {
if (data != null && data.yi18.size() > 0) {

// 控件
ListView listview = (ListView) findViewById(R.id.listview);
// 内容
BaseAdapter adapter = new BaseAdapter() {

// 返回列表行数
@Override
public int getCount() {
return data.yi18.size();
}

// 返回指定下标的数据
@Override
public Object getItem(int position) {
return data.yi18.get(position);
}

// 返回指定下标的视图id
@Override
public long getItemId(int position) {
return position;
}

// 返回视图,显示指定下标的数据
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// int position下标
NoteInfo info = data.yi18.get(position);

// 视图
// View view=View.inflate(上下文, 文件, null)
View view=View.inflate(getBaseContext(), R.layout.list_item, null);

TextView title=(TextView) view.findViewById(R.id.title);

//设置
title.setText(info.title);
return view;
}
};

//设置给控件
listview.setAdapter(adapter);

}
}

引用 8 楼 NeetSonic 的回复:
Quote: 引用 7 楼 hjq2013 的回复:
Quote: 引用 5 楼 NeetSonic 的回复:
Quote: 引用 3 楼 hjq2013 的回复:

贴出错误信息,

捕获的异常是:
android.os.NetworkOnMainThreadException
e.printStackTrace();执行后却没看见Console里有任何输出。。。

访问网络的操作,android不让放在主线程,将其放在分线程即可!

网上找了下,原来使用强制忽略这个政策也是可以的:
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

不过你说的使用分线程访问网络应该是官方比较推荐的方法。

防止程序出现无响应,放在分线程,保持UI线程对用户操作的响应!

捕获的异常是:
android.os.NetworkOnMainThreadException
e.printStackTrace();执行后却没看见Console里有任何输出。。。
访问网络的操作,android不让放在主线程,将其放在分线程即可!
网上找了下,原来使用强制忽略这个政策也是可以的:
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

不过你说的使用分线程访问网络应该是官方比较推荐的方法。
防止程序出现无响应,放在分线程,保持UI线程对用户操作的响应!

引用 10 楼 hjq2013 的回复:
Quote: 引用 8 楼 NeetSonic 的回复:
Quote: 引用 7 楼 hjq2013 的回复:
Quote: 引用 5 楼 NeetSonic 的回复:
Quote: 引用 3 楼 hjq2013 的回复:

贴出错误信息,

捕获的异常是:
android.os.NetworkOnMainThreadException
e.printStackTrace();执行后却没看见Console里有任何输出。。。

访问网络的操作,android不让放在主线程,将其放在分线程即可!

网上找了下,原来使用强制忽略这个政策也是可以的:
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

不过你说的使用分线程访问网络应该是官方比较推荐的方法。

防止程序出现无响应,放在分线程,保持UI线程对用户操作的响应!

查看了下分线程的使用,不过我的Handler对象却没有sendMessage和handleMessag方法,这是什么情况?

引用 10 楼 hjq2013 的回复:
Quote: 引用 8 楼 NeetSonic 的回复:
Quote: 引用 7 楼 hjq2013 的回复:
Quote: 引用 5 楼 NeetSonic 的回复:
Quote: 引用 3 楼 hjq2013 的回复:

贴出错误信息,

捕获的异常是:
android.os.NetworkOnMainThreadException
e.printStackTrace();执行后却没看见Console里有任何输出。。。

访问网络的操作,android不让放在主线程,将其放在分线程即可!

网上找了下,原来使用强制忽略这个政策也是可以的:
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());

不过你说的使用分线程访问网络应该是官方比较推荐的方法。

防止程序出现无响应,放在分线程,保持UI线程对用户操作的响应!

晕了,是我载入错了Package的问题,对android开发还很陌生。。。真是惭愧了。。。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Andriod开发中的HTTP请求的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!