Android客户端与服务器端的json数据交互(很详细)

来源:互联网 发布:网络上py的是什么意思 编辑:程序博客网 时间:2024/05/22 06:55

      Android客户端与服务器端的json数据交互,主要是通过json形式的数据交互,就是json的写入和解析。

 先看效果图,我最讨厌讲东西,一个图没有的。


算了,看来我不是写博客的材料,写不下去了,要排版之类的麻烦,大家还是直接去下载源码,里面有大量的注视,应该能看懂。 下载地址:源码下载地址


登录界面:很传统的随便做了一下:



用的是android4.0的,别人说这样的EditText很有科技感。


注册界面:


也是很传统的,文本框之类的 。


下面看看包名,类名图。(忙着和比人聊天了,差点忘了) 现在继续

客户端的:


服务器端的:


下面贴上客户端的代码:

LoginRegisterActivity.java

package com.gem.hsx.activity;import com.gem.hsx.operation.Operaton;import android.app.Activity;import android.app.ProgressDialog;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;//此为主activity的实现登录的。在android2.3以后,android规定了主activity不允许在主线程中做一些耗时较多的//操作,包括网络的操作,主要是减少应用程序停止响应的问题。下面注释掉的部分是网上找到的方法,加上之后就可以在主线程中//进行联网操作了,但是本人采用了线程的操作,未采用该方法public class LoginRegisterActivity extends Activity {Button login;Button register;EditText etusername;EditText etpassword;String username;String password;ProgressDialog p;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()       //.detectDiskReads()       //.detectDiskWrites()       //.detectNetwork()   // or .detectAll() for all detectable problems       //.penaltyLog()       //.build());       //StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()       //.detectLeakedSqlLiteObjects()    //.penaltyLog()       //.penaltyDeath()       //.build());   init();register.setOnClickListener(new RegisterOnclick());login.setOnClickListener(new LoginOnclick());}private void init() {etusername=(EditText) findViewById(R.id.etusername);etpassword=(EditText) findViewById(R.id.etpassword);login=(Button) findViewById(R.id.login);register=(Button) findViewById(R.id.register);p=new ProgressDialog(LoginRegisterActivity.this);p.setTitle("登录中");p.setMessage("登录中,马上就好");}private class RegisterOnclick implements OnClickListener{public void onClick(View v) {Intent intent=new Intent();intent.setClass(LoginRegisterActivity.this, Register.class);startActivity(intent);}}private class LoginOnclick implements OnClickListener{public void onClick(View arg0) {username=etusername.getText().toString().trim();if (username==null||username.length()<=0) {etusername.requestFocus();etusername.setError("对不起,用户名不能为空");return;}else {username=etusername.getText().toString().trim();}password=etpassword.getText().toString().trim();if (password==null||password.length()<=0) {etpassword.requestFocus();etpassword.setError("对不起,密码不能为空");return;}else {password=etpassword.getText().toString().trim();}p.show();new Thread(new Runnable() {public void run() {Operaton operaton=new Operaton();String result=operaton.login("Login", username, password);Message msg=new Message();msg.obj=result;handler.sendMessage(msg);}}).start();}}Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {String string=(String) msg.obj;p.dismiss();Toast.makeText(LoginRegisterActivity.this, string, 0).show();super.handleMessage(msg);}};}

Register.java

package com.gem.hsx.activity;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import com.gem.hsx.bean.User;import com.gem.hsx.json.WriteJson;import com.gem.hsx.operation.Operaton;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.ProgressDialog;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnFocusChangeListener;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.RadioButton;import android.widget.Toast;public class Register extends Activity {Button submit;Button select;EditText etusername;EditText etpassword;RadioButton ckman;RadioButton ckwoman;EditText etage;ImageView imgphoto;String str;String filepath=null;String jsonString=null;ProgressDialog dialog;private static final int REQUEST_EX = 1;String username=null;String password=null;String sex=null;String age=null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.register);init();//etusername.addTextChangedListener(new MyTextWatcher());etusername.setOnFocusChangeListener(new EtusernameOnFocusChange());select.setOnClickListener(new SelectOnclick());submit.setOnClickListener(new SubmitOnclick());}private void init(){submit=(Button) findViewById(R.id.submit);select=(Button) findViewById(R.id.select);etusername=(EditText) findViewById(R.id.etusername);etpassword=(EditText) findViewById(R.id.etpassword);ckman=(RadioButton) findViewById(R.id.ckman);ckwoman=(RadioButton) findViewById(R.id.ckwoman);etage=(EditText) findViewById(R.id.etage);imgphoto=(ImageView) findViewById(R.id.imgphoto);dialog=new ProgressDialog(Register.this);dialog.setTitle("上传数据中");dialog.setMessage("请稍等...");}//private   class MyTextWatcher implements TextWatcher//{////public void afterTextChanged(Editable s) {// str=etusername.getText().toString().trim();// if (str==null||str.length()<=0) // {//etusername.setError("用户名不能为空");// }// else // {// new Thread(new Runnable() {////public void run() {// Operaton operaton=new Operaton();// String result= operaton.checkusername("Check", str);// Message message=new Message();// message.obj=result;// handler.sendMessage(message);//}//}).start();// //   //  }//}//public void beforeTextChanged(CharSequence s, int start, int count,//int after) {////}////public void onTextChanged(CharSequence s, int start, int before,//int count) {////}////}//Handler handler=new Handler()//{//@Override//public void handleMessage(Message msg) {//String msgobj=msg.obj.toString();//if (msgobj=="该用户名可用") //{//etusername.setFocusable(false);//}//else //{//etusername.requestFocus();//etusername.setError(msgobj);//}    //super.handleMessage(msg);//}//};//private class EtusernameOnFocusChange implements OnFocusChangeListener{public void onFocusChange(View v, boolean hasFocus) {if (!etusername.hasFocus()) {str=etusername.getText().toString().trim();if (str==null||str.length()<=0) {etusername.setError("用户名不能为空");}else {new Thread(new Runnable() {                 //如果用户名不为空,那么将用户名提交到服务器上进行验证,看用户名是否存在,就像JavaEE中利用//ajax一样,虽然你看不到但是它却偷偷摸摸做了很多public void run() {Operaton operaton=new Operaton();String result= operaton.checkusername("Check", str);System.out.println("result:"+result);Message message=new Message();message.obj=result;handler.sendMessage(message);}}).start();}}}}Handler handler=new Handler(){@Overridepublic void handleMessage(Message msg) {String msgobj=msg.obj.toString();System.out.println(msgobj);System.out.println(msgobj.length());if (msgobj.equals("t")) {  etusername.requestFocus();etusername.setError("用户名"+str+"已存在");}else {etpassword.requestFocus();}super.handleMessage(msg);}};private class SelectOnclick implements OnClickListener{public void onClick(View v) {Intent intent = new Intent();intent.putExtra("explorer_title",getString(R.string.dialog_read_from_dir));intent.setDataAndType(Uri.fromFile(new File("/sdcard")), "*/*");intent.setClass(Register.this, ExDialog.class);startActivityForResult(intent, REQUEST_EX);}}protected void onActivityResult(int requestCode, int resultCode,Intent intent) {if (resultCode == RESULT_OK) {Uri uri = intent.getData();filepath=uri.toString().substring(6);System.out.println(filepath);//用户的头像是不是图片格式if(filepath.endsWith("jpg")||filepath.endsWith("png")){File file=new File(filepath);try {InputStream inputStream=new FileInputStream(file);Bitmap bitmap = BitmapFactory.decodeStream(inputStream);imgphoto.setImageBitmap(bitmap);//如果是就将图片显示出来} catch (FileNotFoundException e) {e.printStackTrace();}submit.setClickable(true);}else{submit.setClickable(false);alert();}}}private class SubmitOnclick implements OnClickListener{public void onClick(View v) {username=etusername.getText().toString().trim();password=etpassword.getText().toString().trim();if (ckman.isChecked()) {sex="男";}else {sex="女";}age=etage.getText().toString().trim();if (age==null||age.length()<=0) {  etage.requestFocus();etage.setError("年龄不能为空");return ;}dialog.show();new Thread(new Runnable() {public void run() {Operaton operaton=new Operaton();File file=new File(filepath);String photo=operaton.uploadFile(file, "ImgReciver");//先进行图片上传的操作,然后服务器返回图片保存在服务器的路径,System.out.println("photo---->"+photo);System.out.println("sex:------>"+sex);User user=new User(username, password, sex, age,photo);//构造一个user对象List<User> list=new ArrayList<User>();list.add(user);WriteJson writeJson=new WriteJson();//将user对象写出json形式字符串jsonString= writeJson.getJsonData(list);                    System.out.println(jsonString); String result= operaton.UpData("Register", jsonString);Message msg=new Message();System.out.println("result---->"+result);msg.obj=result;handler1.sendMessage(msg);}}).start();}}private void alert(){Dialog dialog = new AlertDialog.Builder(this).setTitle("提示").setMessage("您选择的不是有效的图片").setPositiveButton("确定",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog,int which) {filepath = null;}}).create();dialog.show();}Handler handler1=new Handler(){@Overridepublic void handleMessage(Message msg) {dialog.dismiss();String msgobj=msg.obj.toString();if(msgobj.equals("t")){Toast.makeText(Register.this, "注册成功", 0).show();Intent intent=new Intent();intent.setClass(Register.this, LoginRegisterActivity.class);startActivity(intent);}else {Toast.makeText(Register.this, "注册失败", 0).show();}super.handleMessage(msg);}};}
ExDialog.java


package com.gem.hsx.activity;import java.io.File;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.ListActivity;import android.content.Context;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.util.Log;import android.view.Display;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.WindowManager;import android.view.WindowManager.LayoutParams;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import com.gem.hsx.activity.R;//由于安卓模拟器里面没有文件浏览器,所以构建一个文件浏览器的对话框 主要是dialog和listview配合//此是一个简单的浏览器主要目的是选择文件后获取文件的路径,借鉴了一些其他人的文件浏览器的写法public class ExDialog extends ListActivity {private List<Map<String, Object>> mData;private String mDir = "/sdcard";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Intent intent = this.getIntent();Bundle bl = intent.getExtras();String title = bl.getString("explorer_title");Uri uri = intent.getData();mDir = uri.getPath();setTitle(title);mData = getData();MyAdapter adapter = new MyAdapter(this);setListAdapter(adapter);WindowManager m = getWindowManager();Display d = m.getDefaultDisplay();LayoutParams p = getWindow().getAttributes();p.height = (int) (d.getHeight() * 0.8);p.width = (int) (d.getWidth() * 0.95);getWindow().setAttributes(p);}private List<Map<String, Object>> getData() {List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();Map<String, Object> map = null;File f = new File(mDir);File[] files = f.listFiles();if (!mDir.equals("/sdcard")) {map = new HashMap<String, Object>();map.put("title", "返回上一级目录/");map.put("info", f.getParent());map.put("img", R.drawable.ex_folder);list.add(map);}if (files != null) {for (int i = 0; i < files.length; i++) {map = new HashMap<String, Object>();map.put("title", files[i].getName());map.put("info", files[i].getPath());if (files[i].isDirectory())map.put("img", R.drawable.ex_folder);elsemap.put("img", R.drawable.ex_doc);list.add(map);}}return list;}@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {Log.d("MyListView4-click", (String) mData.get(position).get("info"));if ((Integer) mData.get(position).get("img") == R.drawable.ex_folder) {mDir = (String) mData.get(position).get("info");mData = getData();MyAdapter adapter = new MyAdapter(this);setListAdapter(adapter);} else {finishWithResult((String) mData.get(position).get("info"));}}public final class ViewHolder {public ImageView img;public TextView title;public TextView info;}public class MyAdapter extends BaseAdapter {private LayoutInflater mInflater;public MyAdapter(Context context) {this.mInflater = LayoutInflater.from(context);}public int getCount() {return mData.size();}public Object getItem(int arg0) {return null;}public long getItemId(int arg0) {return 0;}public View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {holder = new ViewHolder();convertView = mInflater.inflate(R.layout.listview, null);holder.img = (ImageView) convertView.findViewById(R.id.img);holder.title = (TextView) convertView.findViewById(R.id.title);//holder.info = (TextView) convertView.findViewById(R.id.info);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}holder.img.setBackgroundResource((Integer) mData.get(position).get("img"));holder.title.setText((String) mData.get(position).get("title"));//holder.info.setText((String) mData.get(position).get("info"));return convertView;}}private void finishWithResult(String path) {Bundle conData = new Bundle();conData.putString("results", "Thanks Thanks");Intent intent = new Intent();intent.putExtras(conData);Uri startDir = Uri.fromFile(new File(path));intent.setDataAndType(startDir,"vnd.android.cursor.dir/lysesoft.andexplorer.file");setResult(RESULT_OK, intent);finish();}};

JsonUtil.java

package com.gem.hsx.json;import java.lang.reflect.Type;import java.util.ArrayList;import java.util.List;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;public class JsonUtil {public List<?> StringFromJson (String jsondata){     Type listType = new TypeToken<List<?>>(){}.getType();Gson gson=new Gson();ArrayList<?> list=gson.fromJson(jsondata, listType);return list;}}

WriteJson.java

package com.gem.hsx.json;import java.util.List;import com.google.gson.Gson;public class WriteJson {/* * 通过引入gson jar包 写入 json 数据 */public String getJsonData(List<?> list){//此处要注意,时常会出现说找不到Gson类的情况,这时我们只需要将导入的包和系统提供换换顺序就行了Gson gson=new Gson();//利用google提供的gson将一个list集合写成json形式的字符串String jsonstring=gson.toJson(list);return jsonstring;}/* * 当然如果不用gson也可以用传统的方式进行写入json数据或者利用StringBuffer拼字符串 写成json字符串形式 */}







	
				
		
原创粉丝点击