關於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);
}
}
至此完成。