package com.android.myjson.http;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpUtils {
private static String content = "";
public HttpUtils() {
// TODO Auto-generated constructor stub
}
public static String getJsonContent(String url_path) {
//联网子线程
mthread(url_path);
// System.out.println("return" + content);
return content;
}
private static void mthread(final String url_path) {
// TODO Auto-generated method stub
Thread mThread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
URL url = new URL(url_path);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setConnectTimeout(3000);
connection.setDoInput(true);
connection.setRequestMethod("GET");
int code = connection.getResponseCode();
if (code == 200) {
content = changeInputStream(connection.getInputStream());
// System.out.println("code" + content);
}
} catch (Exception e) {
// TODO: handle exception
}
}
});
mThread.start();
/*
* 如果没有下面的方法,则程序会在执行getJsonContent()并返回空的content
* 同时并执行run方法里面的代码把数据赋值给content。
* 应该是同时进行的,只不过网络获取数据的子线程比较耗时,
* 所以主线程先return了空的content值,子线程来不及在主线程return前赋值
* 加上join方法就代表主线程在启动子线程后要等待子线程完成才接着执行主线程下面的操作
*/
try {
mThread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static String changeInputStream(InputStream inputStream) {
// TODO Auto-generated method stub
String jsonString = "";
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = 0;
byte[] data = new byte[1024];
try {
while ((len = inputStream.read(data)) != -1) {
outputStream.write(data, 0, len);
}
jsonString = new String(outputStream.toByteArray());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonString;
}
}
Android之网络通信
网络通信之Thread
最近写到客户端与服务器之间的网络通信代码,发现老罗视频上的关于Json解析的源码不能用。花了一番功夫才得知老罗写的Android版本是较低的。Android4.0 以后不允许在主线程进行网络连接,否则会出现 android.os.NetworkOnMainThreadException。因此,必须另起一个线程进行网络连接方面的操作。但是另起一个线程后,执行过程是异步的,就是说如果想要得到子线程中的网络数据并操作它得使主线程等待子线程完成才继续执行。而要实现这个过程就要用到join方法。主线程生成并起启动了子线程,而子线程里要进行大量的耗时的运算(这里可以借鉴下线程的作用),当主线程处理完其他的事务后,需要用到子线程的处理结果,这个时候就要用到join();方法了。join方法的作用就是主线程等待子线程的结束才继续执行主线程。其实Join方法实现是通过wait(Object 提供的方法)。当main线程调用join方法的时候,main线程会获得子线程对象的锁(wait 意味着拿到该对象的锁),调用该对象的wait(等待时间),直到该对象唤醒main线程,比如退出后。这就意味着main 线程调用join方法时,必须能够拿到子线程对象的锁,如果拿不到它是无法wait的,比如t.join(1000)不是说明了main线程等待1 秒,如果在它等待之前,其他线程获取了t对象的锁,它等待的时间就不是1秒了。下面上段代码看看:主函数中String jsonString = HttpUtils.getJsonContent(path);这是通过HttpUtils类下的getJsonContent()方法获取从网络中得到的数据。