关于Android与服务器的数据交互,简单累类型的简单,本人也是初学。做小项目遇到了客户端上传图片(头像)或者视频到服务器,读取。
网上也找了一些。 现在想谈谈自己的思路,方法:
关键点:AsyncTask, 利用异步处理。 重写两个函数, (doInBackground和OnpostExcute)
重点:两个函数属于不同的线程。我们都知道不可以在主线程中进行网络数据的访问。 然而利用AsyncTask,其中的doInBackground函数,我们可以简单理解为是一个子线,
而onpostExcucte可以简单理解为主线程。
doinBackground所得到的结果可以直接在onpostExcute中拿到,可以根据拿到的数据直接在onPostExcute中修改UI。
举个例子,我们要在客户端显示用户头像, 那么我们的目标就是拿到图片在服务器的地址,(转为bitmap.略)
下边我结合gSOn。我们都知道gSon可以再哭护短手机端进行数据传递,可以传递一个对象,一个集合.....,只不过他们之间传输的是字符串,比如我们在服务器发送一个对象信息,就需要把该对象通过GSON 发送,相应的,到了Android这边,就需要用到json解析,
下边我贴出来一个实例供大家理解: (需要导入gson的jar包)
public void getVideoPath(){//得到视频地址的方法
final String PATH="http://10.203.1.51:8080/Test/UserLoginServlet"; //指定服务器的Servlet,注意不要用Localhost,要用IP
AsyncTask<Void, Void, String> at=new AsyncTask<Void, Void, String>(){
@Override//AsyncTask 三个参数,前两个貌似固定(新手)第三个重要:我们需要什么就在此设定什么,比如集合(我的是String,也可以是对象)
protected String doInBackground(Void... params) {
try {
HttpClient client = new DefaultHttpClient();
HttpGet get=new HttpGet(PATH);
HttpResponse response = client.execute(get);
if(response.getStatusLine().getStatusCode()==200){//响应Ok
//接下来读取数据`
InputStream is=response.getEntity().getContent();
byte da[]=take(is);//返回一个数组,即JSON字符串
String json=new String(da);
Gson gson=new Gson();
//Type typeOfT=new TypeToken<Users>(){}.getType();
Users users=gson.fromJson(json, new TypeToken<Users>(){}.getType());
String uri=users.getImageURl();
return uri;//这边注意,我们需要什么。在这直接返回,在下函数可直接拿到
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {//此处的result 就是上边函数返回的uri
super.onPostExecute(result);
if(result!=null){//
System.out.println(result);//
//这就拿到了上边的uri,即服务器发送来的;你可以把Sgtring 换成对象,,集合。
//可在此函数直接修改ui
}
}
};
at.execute();//这句别忘了
}
我再贴出服务器端的
@WebServlet("/UserLoginServlet")
public class UserLoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
// 视频地址:http://localhost:8080/Test/radio/aaa.wmv
User user=new User();
Gson gson=new Gson();
String user1=gson.toJson(new Users("TRUE","http://localhost:8080/Test/radio/aaa.wmv"));//注意于User实体类字段相匹配
response.getWriter().write(user1);//这就把一个User对象写出去,可在Android拿到
System.out.println(user);
}
}
至此完成。