天天看點

Android用戶端與伺服器端的json資料互動(很詳細)

分類:  Android學習

2014-03-17

21:20 1426人閱讀 

評論 (0)  收藏 舉報

 Android用戶端與伺服器端的json資料互動,主要是通過json形式的資料互動,就是json的寫入和解析。

 先看效果圖,我最讨厭講東西,一個圖沒有的。

算了,看來我不是寫部落格的材料,寫不下去了,要排版之類的麻煩,大家還是直接去下載下傳源碼,裡面有大量的注視,應該能看懂。 下載下傳位址:

源碼下載下傳位址

登入界面:很傳統的随便做了一下:

用的是android4.0的,别人說這樣的EditText很有科技感。

注冊界面:

也是很傳統的,文本框之類的 。

下面看看包名,類名圖。(忙着和比人聊天了,差點忘了) 現在繼續

用戶端的:

伺服器端的:

下面貼上用戶端的代碼:

LoginRegisterActivity.java

[java] 

view

plain

copy

  1. <span style="font-size:18px;color:#999900;">package com.gem.hsx.activity;  
  2. import com.gem.hsx.operation.Operaton;  
  3. import android.app.Activity;  
  4. import android.app.ProgressDialog;  
  5. import android.content.Intent;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.os.Message;  
  9. import android.view.View;  
  10. import android.view.View.OnClickListener;  
  11. import android.widget.Button;  
  12. import android.widget.EditText;  
  13. import android.widget.Toast;  
  14. //此為主activity的實作登入的。在android2.3以後,android規定了主activity不允許在主線程中做一些耗時較多的  
  15. //操作,包括網絡的操作,主要是減少應用程式停止響應的問題。下面注釋掉的部分是網上找到的方法,加上之後就可以在主線程中  
  16. //進行聯網操作了,但是本人采用了線程的操作,未采用該方法  
  17. public class LoginRegisterActivity extends Activity {  
  18.     Button login;  
  19.     Button register;  
  20.     EditText etusername;  
  21.     EditText etpassword;  
  22.     String username;  
  23.     String password;  
  24.     ProgressDialog p;  
  25.     @Override  
  26.     public void onCreate(Bundle savedInstanceState) {  
  27.         super.onCreate(savedInstanceState);  
  28.         setContentView(R.layout.main);  
  29. //      StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()         
  30. //      .detectDiskReads()         
  31. //      .detectDiskWrites()         
  32. //      .detectNetwork()   // or .detectAll() for all detectable problems         
  33. //      .penaltyLog()         
  34. //      .build());         
  35. //      StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()         
  36. //      .detectLeakedSqlLiteObjects()      
  37. //      .penaltyDeath()         
  38. //      .build());     
  39.         init();  
  40.         register.setOnClickListener(new RegisterOnclick());  
  41.         login.setOnClickListener(new LoginOnclick());  
  42.     }  
  43.     private void init()   
  44.     {  
  45.         etusername=(EditText) findViewById(R.id.etusername);  
  46.         etpassword=(EditText) findViewById(R.id.etpassword);  
  47.         login=(Button) findViewById(R.id.login);  
  48.         register=(Button) findViewById(R.id.register);  
  49.         p=new ProgressDialog(LoginRegisterActivity.this);  
  50.         p.setTitle("登入中");  
  51.         p.setMessage("登入中,馬上就好");  
  52.     private class RegisterOnclick implements OnClickListener  
  53.         public void onClick(View v) {  
  54.             Intent intent=new Intent();  
  55.             intent.setClass(LoginRegisterActivity.this, Register.class);  
  56.             startActivity(intent);  
  57.         }  
  58.     private class LoginOnclick implements OnClickListener  
  59.         public void onClick(View arg0) {  
  60.             username=etusername.getText().toString().trim();  
  61.             if (username==null||username.length()<=0)   
  62.             {         
  63.                 etusername.requestFocus();  
  64.                 etusername.setError("對不起,使用者名不能為空");  
  65.                 return;  
  66.             }  
  67.             else   
  68.             {  
  69.                 username=etusername.getText().toString().trim();  
  70.             password=etpassword.getText().toString().trim();  
  71.             if (password==null||password.length()<=0)   
  72.                 etpassword.requestFocus();  
  73.                 etpassword.setError("對不起,密碼不能為空");  
  74.                 password=etpassword.getText().toString().trim();  
  75.             p.show();  
  76.             new Thread(new Runnable() {  
  77.                 public void run() {  
  78.                     Operaton operaton=new Operaton();  
  79.                     String result=operaton.login("Login", username, password);                
  80.                     Message msg=new Message();  
  81.                     msg.obj=result;  
  82.                     handler.sendMessage(msg);  
  83.                 }  
  84.             }).start();  
  85.     }     
  86.     Handler handler=new Handler(){  
  87.         @Override  
  88.         public void handleMessage(Message msg) {  
  89.             String string=(String) msg.obj;  
  90.             p.dismiss();  
  91.             Toast.makeText(LoginRegisterActivity.this, string, 0).show();  
  92.             super.handleMessage(msg);  
  93.         }     
  94.     };  
  95. }</span>  

Register.java

  1. <span style="font-size:18px;">package com.gem.hsx.activity;  
  2. import java.io.File;  
  3. import java.io.FileInputStream;  
  4. import java.io.FileNotFoundException;  
  5. import java.io.InputStream;  
  6. import java.util.ArrayList;  
  7. import java.util.List;  
  8. import com.gem.hsx.bean.User;  
  9. import com.gem.hsx.json.WriteJson;  
  10. import android.app.AlertDialog;  
  11. import android.app.Dialog;  
  12. import android.content.DialogInterface;  
  13. import android.graphics.Bitmap;  
  14. import android.graphics.BitmapFactory;  
  15. import android.net.Uri;  
  16. import android.view.View.OnFocusChangeListener;  
  17. import android.widget.ImageView;  
  18. import android.widget.RadioButton;  
  19. public class Register extends Activity {  
  20.     Button submit;  
  21.     Button select;  
  22.     RadioButton ckman;  
  23.     RadioButton ckwoman;  
  24.     EditText etage;  
  25.     ImageView imgphoto;  
  26.     String str;  
  27.     String filepath=null;  
  28.     String jsonString=null;  
  29.     ProgressDialog dialog;  
  30.     private static final int REQUEST_EX = 1;  
  31.     String username=null;  
  32.     String password=null;  
  33.     String sex=null;  
  34.     String age=null;  
  35.     protected void onCreate(Bundle savedInstanceState) {  
  36.         setContentView(R.layout.register);  
  37.         //etusername.addTextChangedListener(new MyTextWatcher());  
  38.         etusername.setOnFocusChangeListener(new EtusernameOnFocusChange());  
  39.         select.setOnClickListener(new SelectOnclick());  
  40.         submit.setOnClickListener(new SubmitOnclick());  
  41.     private void init()  
  42.         submit=(Button) findViewById(R.id.submit);  
  43.         select=(Button) findViewById(R.id.select);  
  44.         ckman=(RadioButton) findViewById(R.id.ckman);  
  45.         ckwoman=(RadioButton) findViewById(R.id.ckwoman);  
  46.         etage=(EditText) findViewById(R.id.etage);  
  47.         imgphoto=(ImageView) findViewById(R.id.imgphoto);  
  48.         dialog=new ProgressDialog(Register.this);  
  49.         dialog.setTitle("上傳資料中");  
  50.         dialog.setMessage("請稍等...");  
  51.     //  private   class MyTextWatcher implements TextWatcher  
  52.     //  {  
  53.     //  
  54.     //      public void afterTextChanged(Editable s) {  
  55.     //           str=etusername.getText().toString().trim();  
  56.     //           if (str==null||str.length()<=0)   
  57.     //           {  
  58.     //              etusername.setError("使用者名不能為空");  
  59.     //           }  
  60.     //           else   
  61.     //           {    
  62.     //               new Thread(new Runnable() {  
  63.     //                    
  64.     //                  public void run() {  
  65.     //                       Operaton operaton=new Operaton();  
  66.     //                       String result= operaton.checkusername("Check", str);  
  67.     //                       Message message=new Message();  
  68.     //                       message.obj=result;  
  69.     //                       handler.sendMessage(message);  
  70.     //                  }  
  71.     //              }).start();  
  72.     //                 
  73.     //               
  74.     //            }  
  75.     //      }  
  76.     //      public void beforeTextChanged(CharSequence s, int start, int count,  
  77.     //              int after) {  
  78.     //            
  79.     //      public void onTextChanged(CharSequence s, int start, int before,  
  80.     //              int count) {  
  81.     //        
  82.     //  }  
  83.     //  Handler handler=new Handler()  
  84.     //      @Override  
  85.     //      public void handleMessage(Message msg) {  
  86.     //          String msgobj=msg.obj.toString();  
  87.     //          if (msgobj=="該使用者名可用")   
  88.     //          {  
  89.     //              etusername.setFocusable(false);  
  90.     //          }  
  91.     //          else   
  92.     //              etusername.requestFocus();  
  93.     //              etusername.setError(msgobj);  
  94.     //          }         
  95.     //          super.handleMessage(msg);  
  96.     //      }     
  97.     //  };  
  98.     //    
  99.     private class EtusernameOnFocusChange implements OnFocusChangeListener  
  100.         public void onFocusChange(View v, boolean hasFocus) {  
  101.             if (!etusername.hasFocus()) {  
  102.                 str=etusername.getText().toString().trim();  
  103.                 if (str==null||str.length()<=0)   
  104.                 {  
  105.                     etusername.setError("使用者名不能為空");  
  106.                 else   
  107.                 {     
  108.                     new Thread(new Runnable() {  
  109.                  //如果使用者名不為空,那麼将使用者名送出到伺服器上進行驗證,看使用者名是否存在,就像JavaEE中利用  
  110.                 //ajax一樣,雖然你看不到但是它卻偷偷摸摸做了很多  
  111.                         public void run() {  
  112.                             Operaton operaton=new Operaton();  
  113.                             String result= operaton.checkusername("Check", str);  
  114.                             System.out.println("result:"+result);  
  115.                             Message message=new Message();  
  116.                             message.obj=result;  
  117.                             handler.sendMessage(message);  
  118.                         }  
  119.                     }).start();  
  120.     Handler handler=new Handler()  
  121.             String msgobj=msg.obj.toString();  
  122.             System.out.println(msgobj);  
  123.             System.out.println(msgobj.length());  
  124.             if (msgobj.equals("t")) {    
  125.                 etusername.setError("使用者名"+str+"已存在");  
  126.             }     
  127.             {                         
  128.     private class SelectOnclick implements OnClickListener  
  129.             Intent intent = new Intent();  
  130.             intent.putExtra("explorer_title",  
  131.                     getString(R.string.dialog_read_from_dir));  
  132.             intent.setDataAndType(Uri.fromFile(new File("/sdcard")), "*/*");  
  133.             intent.setClass(Register.this, ExDialog.class);  
  134.             startActivityForResult(intent, REQUEST_EX);  
  135.     protected void onActivityResult(int requestCode, int resultCode,  
  136.             Intent intent) {  
  137.         if (resultCode == RESULT_OK) {  
  138.             Uri uri = intent.getData();  
  139.             filepath=uri.toString().substring(6);  
  140.             System.out.println(filepath);  
  141.             //使用者的頭像是不是圖檔格式  
  142.             if(filepath.endsWith("jpg")||filepath.endsWith("png"))  
  143.                 File file=new File(filepath);  
  144.                 try {  
  145.                     InputStream inputStream=new FileInputStream(file);  
  146.                     Bitmap bitmap = BitmapFactory.decodeStream(inputStream);  
  147.                     imgphoto.setImageBitmap(bitmap);//如果是就将圖檔顯示出來  
  148.                 } catch (FileNotFoundException e) {  
  149.                     e.printStackTrace();  
  150.                 submit.setClickable(true);  
  151.             else  
  152.                 submit.setClickable(false);  
  153.                 alert();  
  154.     private class SubmitOnclick implements OnClickListener  
  155.             if (ckman.isChecked()) {  
  156.                 sex="男";  
  157.             else {  
  158.                 sex="女";  
  159.             age=etage.getText().toString().trim();  
  160.             if (age==null||age.length()<=0)   
  161.             {    
  162.                 etage.requestFocus();  
  163.                 etage.setError("年齡不能為空");             
  164.                 return ;  
  165.             dialog.show();  
  166.                     File file=new File(filepath);  
  167.                     String photo=operaton.uploadFile(file, "ImgReciver");  
  168.                     //先進行圖檔上傳的操作,然後伺服器傳回圖檔儲存在伺服器的路徑,  
  169.                     System.out.println("photo---->"+photo);  
  170.                     System.out.println("sex:------>"+sex);  
  171.                     User user=new User(username, password, sex, age,photo);  
  172.                     //構造一個user對象  
  173.                     List<User> list=new ArrayList<User>();  
  174.                     list.add(user);  
  175.                     WriteJson writeJson=new WriteJson();  
  176.                     //将user對象寫出json形式字元串  
  177.                     jsonString= writeJson.getJsonData(list);  
  178.                     System.out.println(jsonString);   
  179.                     String result= operaton.UpData("Register", jsonString);  
  180.                     System.out.println("result---->"+result);  
  181.                     handler1.sendMessage(msg);  
  182.     private void alert()  
  183.         Dialog dialog = new AlertDialog.Builder(this)  
  184.         .setTitle("提示")  
  185.         .setMessage("您選擇的不是有效的圖檔")  
  186.         .setPositiveButton("确定",  
  187.                 new DialogInterface.OnClickListener() {  
  188.             public void onClick(DialogInterface dialog,  
  189.                     int which) {  
  190.                 filepath = null;  
  191.         })  
  192.         .create();  
  193.         dialog.show();  
  194.     Handler handler1=new Handler()  
  195.             dialog.dismiss();  
  196.             if(msgobj.equals("t"))  
  197.                 Toast.makeText(Register.this, "注冊成功", 0).show();  
  198.                 Intent intent=new Intent();  
  199.                 intent.setClass(Register.this, LoginRegisterActivity.class);  
  200.                 startActivity(intent);  
  201.                 Toast.makeText(Register.this, "注冊失敗", 0).show();  

ExDialog.java

  1. package com.gem.hsx.activity;  
  2. import java.util.HashMap;  
  3. import java.util.Map;  
  4. import android.app.ListActivity;  
  5. import android.content.Context;  
  6. import android.util.Log;  
  7. import android.view.Display;  
  8. import android.view.LayoutInflater;  
  9. import android.view.ViewGroup;  
  10. import android.view.WindowManager;  
  11. import android.view.WindowManager.LayoutParams;  
  12. import android.widget.BaseAdapter;  
  13. import android.widget.ListView;  
  14. import android.widget.TextView;  
  15. import com.gem.hsx.activity.R;  
  16. //由于安卓模拟器裡面沒有檔案浏覽器,是以建構一個檔案浏覽器的對話框 主要是dialog和listview配合  
  17. //此是一個簡單的浏覽器主要目的是選擇檔案後擷取檔案的路徑,借鑒了一些其他人的檔案浏覽器的寫法  
  18. public class ExDialog extends ListActivity {  
  19.     private List<Map<String, Object>> mData;  
  20.     private String mDir = "/sdcard";  
  21.         Intent intent = this.getIntent();  
  22.         Bundle bl = intent.getExtras();  
  23.         String title = bl.getString("explorer_title");  
  24.         Uri uri = intent.getData();  
  25.         mDir = uri.getPath();  
  26.         setTitle(title);  
  27.         mData = getData();  
  28.         MyAdapter adapter = new MyAdapter(this);  
  29.         setListAdapter(adapter);  
  30.         WindowManager m = getWindowManager();  
  31.         Display d = m.getDefaultDisplay();  
  32.         LayoutParams p = getWindow().getAttributes();  
  33.         p.height = (int) (d.getHeight() * 0.8);  
  34.         p.width = (int) (d.getWidth() * 0.95);  
  35.         getWindow().setAttributes(p);  
  36.     private List<Map<String, Object>> getData() {  
  37.         List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();  
  38.         Map<String, Object> map = null;  
  39.         File f = new File(mDir);  
  40.         File[] files = f.listFiles();  
  41.         if (!mDir.equals("/sdcard")) {  
  42.             map = new HashMap<String, Object>();  
  43.             map.put("title", "傳回上一級目錄/");  
  44.             map.put("info", f.getParent());  
  45.             map.put("img", R.drawable.ex_folder);  
  46.             list.add(map);  
  47.         if (files != null) {  
  48.             for (int i = 0; i < files.length; i++) {  
  49.                 map = new HashMap<String, Object>();  
  50.                 map.put("title", files[i].getName());  
  51.                 map.put("info", files[i].getPath());  
  52.                 if (files[i].isDirectory())  
  53.                     map.put("img", R.drawable.ex_folder);  
  54.                 else  
  55.                     map.put("img", R.drawable.ex_doc);  
  56.                 list.add(map);  
  57.         return list;  
  58.     protected void onListItemClick(ListView l, View v, int position, long id) {  
  59.         Log.d("MyListView4-click", (String) mData.get(position).get("info"));  
  60.         if ((Integer) mData.get(position).get("img") == R.drawable.ex_folder) {  
  61.             mDir = (String) mData.get(position).get("info");  
  62.             mData = getData();  
  63.             MyAdapter adapter = new MyAdapter(this);  
  64.             setListAdapter(adapter);  
  65.         } else {  
  66.             finishWithResult((String) mData.get(position).get("info"));  
  67.     public final class ViewHolder {  
  68.         public ImageView img;  
  69.         public TextView title;  
  70.         public TextView info;  
  71.     public class MyAdapter extends BaseAdapter {  
  72.         private LayoutInflater mInflater;  
  73.         public MyAdapter(Context context) {  
  74.             this.mInflater = LayoutInflater.from(context);  
  75.         public int getCount() {  
  76.             return mData.size();  
  77.         public Object getItem(int arg0) {  
  78.             return null;  
  79.         public long getItemId(int arg0) {  
  80.             return 0;  
  81.         public View getView(int position, View convertView, ViewGroup parent) {  
  82.             ViewHolder holder = null;  
  83.             if (convertView == null) {  
  84.                 holder = new ViewHolder();  
  85.                 convertView = mInflater.inflate(R.layout.listview, null);  
  86.                 holder.img = (ImageView) convertView.findViewById(R.id.img);  
  87.                 holder.title = (TextView) convertView.findViewById(R.id.title);  
  88.                 //  holder.info = (TextView) convertView.findViewById(R.id.info);  
  89.                 convertView.setTag(holder);  
  90.             } else {  
  91.                 holder = (ViewHolder) convertView.getTag();  
  92.             holder.img.setBackgroundResource((Integer) mData.get(position).get(  
  93.             "img"));  
  94.             holder.title.setText((String) mData.get(position).get("title"));  
  95.             //holder.info.setText((String) mData.get(position).get("info"));  
  96.             return convertView;  
  97.     private void finishWithResult(String path) {  
  98.         Bundle conData = new Bundle();  
  99.         conData.putString("results", "Thanks Thanks");  
  100.         Intent intent = new Intent();  
  101.         intent.putExtras(conData);  
  102.         Uri startDir = Uri.fromFile(new File(path));  
  103.         intent.setDataAndType(startDir,  
  104.         "vnd.android.cursor.dir/lysesoft.andexplorer.file");  
  105.         setResult(RESULT_OK, intent);  
  106.         finish();  
  107. };  

JsonUtil.java

  1. <pre name="code" class="java">package com.gem.hsx.json;  
  2. import java.lang.reflect.Type;  
  3. import com.google.gson.Gson;  
  4. import com.google.gson.reflect.TypeToken;  
  5. public class JsonUtil {  
  6.     public List<?> StringFromJson (String jsondata)  
  7.     {       
  8.         Type listType = new TypeToken<List<?>>(){}.getType();  
  9.         Gson gson=new Gson();  
  10.         ArrayList<?> list=gson.fromJson(jsondata, listType);  
  11. }</pre><br>  
  12. <pre></pre>  
  13. <p></p>  
  14. WriteJson.java  
  15. <p><span style="font-size:18px"></span></p>  
  16. public class WriteJson {  
  17.     /* 
  18.      * 通過引入gson jar包 寫入 json 資料 
  19.      */  
  20.     public String getJsonData(List<?> list)  
  21. //此處要注意,時常會出現說找不到Gson類的情況,這時我們隻需要将導入的包和系統提供換換順序就行了  
  22.         Gson gson=new Gson();//利用google提供的gson将一個list集合寫成json形式的字元串  
  23.         String jsonstring=gson.toJson(list);  
  24.         return jsonstring;  
  25.      * 當然如果不用gson也可以用傳統的方式進行寫入json資料或者利用StringBuffer拼字元串 寫成json字元串形式 
  26. <br>  
  27. <pre></pre>