Android客户端与服务器端的json数据交互,主要是通过json形式的数据交互,就是json的写入和解析。
先看效果图,我最讨厌讲东西,一个图没有的。
算了,看来我不是写博客的材料,写不下去了,要排版之类的麻烦,大家还是直接去下载源码,里面有大量的注视,应该能看懂。 下载地址:源码下载地址
登录界面:很传统的随便做了一下:
用的是android4.0的,别人说这样的EditText很有科技感。
注册界面:
也是很传统的,文本框之类的 。
下面看看包名,类名图。(忙着和比人聊天了,差点忘了) 现在继续
客户端的:
服务器端的:
下面贴上客户端的代码:
LoginRegisterActivity.java
- <span style="font-size:18px;color:#999900;">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;
- @Override
- public 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(){
- @Override
- public void handleMessage(Message msg) {
- String string=(String) msg.obj;
- p.dismiss();
- Toast.makeText(LoginRegisterActivity.this, string, 0).show();
- super.handleMessage(msg);
- }
- };
- }</span>
Register.java
- <span style="font-size:18px;">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;
- @Override
- protected 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()
- {
- @Override
- public 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()
- {
- @Override
- public 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);
- }
- };
- }</span>
- 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";
- @Override
- protected 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);
- else
- map.put("img", R.drawable.ex_doc);
- list.add(map);
- }
- }
- return list;
- }
- @Override
- protected 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
- <pre name="code" class="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;
- }
- }</pre><br>
- <pre></pre>
- <p></p>
- WriteJson.java
- <p><span style="font-size:18px"></span></p>
- <pre name="code" class="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字符串形式
- */
- }</pre><br>
- <br>
- <br>
- <br>
- <br>
- <br>
- <p></p>
- <br>
- <pre></pre>
- <pre></pre>