这两天在写从服务器接受数据解析json数据
这个网络请求算是把我整惨了
先是代码
public class downloadActivity extends AppCompatActivity {
private String url = "http://www.baidu.com";
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_download);
final Button request = (Button)findViewById(R.id.send);
new Thread(new Runnable() {
@Override
public void run() {
//从网络获取数据
final String msg = get(url);
mHandler.post(new Runnable() {
@Override
public void run() {
request.setText(msg);
}
});
}
}).start();
}
public String get(String url) {
HttpURLConnection conn = null;
try {
// 利用string url构建URL对象
URL mURL = new URL(url);
conn = (HttpURLConnection) mURL.openConnection();
conn.setRequestMethod("GET");
conn.setReadTimeout(10000);
conn.setConnectTimeout(10000);
int responseCode = conn.getResponseCode();
// String msg = getString(responseCode);
if (responseCode == 200) {
InputStream is = conn.getInputStream();
String response = getStringFromInputStream(is);
return response;
} else {
throw new NetworkErrorException("response status is "+responseCode);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.disconnect();
}
}
return null;
}
private static String getStringFromInputStream(InputStream is)
throws IOException {
ByteArrayOutputStream os = new ByteArrayOutputStream();
// 模板代码
byte[] buffer = new byte[1024];
int len = -1;
while ((len = is.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
is.close();
String state = os.toString();// 把流中的数据转换成字符串,采用的编码是utf-8(模拟器默认编码)
os.close();
return state;
}
}
刚开始是不知道要在子线程中进行请求,所以顺便再谨记以下在ui线程中请求会阻塞,网络请求又比较费时,要放在子线程中
简书有篇文章写的特别详细
要好好拜读一下
但在中间我还除了个错误是 在 String msg = getString(responseCode) 会抛出异常,因为getString 的参数是resId,并不是能把int数据转化为String,确实傻比了
但是虽然这个请求没问题了,但是我的问题还没解决,因为我请求服务器还是有问题,代码里测试baidu是没问题的,我请求服务器时getResponseCode是会抛出异常的,而且我还没解决,应该是url有问题
这几天受刺激比较大,觉得发奋图强愈发重要了,决定要好好看算法和数据结构,过两天建个自己的博客网站,向学长学习。
继续加油!