因为最近在更新我的项目,就想着把自己在项目中用到的一些的简单的与网络交互的方法总结一下,所以最近Android网络编程方面的博文会比较多一些,我尽量以最简单的方法给大家分享,让大家明白易懂。如果有什么不对的地方,还请大家留言指出。
这次是利用PHP操作MySql,将Android上面输入的数据插入到MySql中,这里我已经给大家写好了PHP端的代码,如果大家想要自己测试,只需要将php端的代码复制即可,Android端的代码得换包。OK,下面我先给大家贴出来效果图:
Android端:
MySql数据库:
执行程序之后的数据库:
Android端的代码:
MainActivity类:
1 package com.example.insertphp;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.apache.http.NameValuePair;
7 import org.apache.http.message.BasicNameValuePair;
8 import org.json.JSONObject;
9
10 import android.app.Activity;
11 import android.os.Bundle;
12 import android.os.StrictMode;
13 import android.util.Log;
14 import android.view.View;
15 import android.view.View.OnClickListener;
16 import android.widget.Button;
17 import android.widget.EditText;
18
19 public class MainActivity extends Activity {
20
21 //声明接口地址
22 private String url = "http://10.17.64.8:8080/testregister/register.php";
23
24 private String a;
25 private String b;
26
27 private EditText et1;
28 private EditText et2;
29 private Button btn;
30
31
32
33 @Override
34 protected void onCreate(Bundle savedInstanceState) {
35 super.onCreate(savedInstanceState);
36 setContentView(R.layout.activity_main);
37
38 et1 = (EditText) findViewById(R.id.edtv);
39 et2 = (EditText) findViewById(R.id.edt);
40 btn = (Button) findViewById(R.id.bt);
41
42 btn.setOnClickListener(new OnClickListener() {
43
44 @Override
45 public void onClick(View arg0) {
46
47 List<NameValuePair> params = new ArrayList<NameValuePair>();
48 //获取输入框中的内容
49 a = et1.getText().toString();
50 b = et2.getText().toString();
51
52 //替换键值对,这里的键必须和接口中post传递的键一致
53 params.add(new BasicNameValuePair("name", a));
54 params.add(new BasicNameValuePair("password", b));
55
56 JSONParser jsonParser = new JSONParser();
57
58 try{
59 JSONObject json = jsonParser.makeHttpRequest(url,"POST", params);
60 Log.v("uploadsucceed", "uploadsucceed");
61
62 }catch(Exception e){
63 e.printStackTrace();
64 }
65
66
67 System.out.println("输入的第一个内容:" + a);
68 System.out.println("输入的第二个内容:" + b);
69
70 }
71 });
72
73 //下面的代码是必须加上的,具体的意义还需要大家去探索吧,这里不是主要讲的
74
75 StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
76 .detectDiskReads()
77 .detectDiskWrites()
78 .detectNetwork() // or .detectAll() for all detectable problems
79 .penaltyLog()
80 .build());
81
82 StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
83 .detectLeakedSqlLiteObjects()
84 .detectLeakedClosableObjects()
85 .penaltyLog()
86 .penaltyDeath()
87 .build());
88
89 }
90
91 }
注意:这里的接口地址是我个人的本地服务器的地址,你如果在自己电脑上测试必须更改地址,查看自己本地的地址方法:win键+R 然后输入cmd,之后在执行框中输入ipconfig/all,在执行之后的结果中招IPv4就可以了。testregister是我的项目包,register.php是我的php文件。
特别注意:在将数据添加在list中时,键值对中的键名必须与接口中POST传递的名称一致才可以,不然会出现空数据的情况。
下面的代码是使用网络编程连接服务端的,其中里面代码的意义我在已经介绍过。
JSONParser类代码:
1 package com.example.insertphp;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.io.InputStreamReader;
7 import java.io.UnsupportedEncodingException;
8 import java.util.List;
9
10 import org.apache.http.HttpEntity;
11 import org.apache.http.HttpResponse;
12 import org.apache.http.NameValuePair;
13 import org.apache.http.client.ClientProtocolException;
14 import org.apache.http.client.entity.UrlEncodedFormEntity;
15 import org.apache.http.client.methods.HttpPost;
16 import org.apache.http.impl.client.DefaultHttpClient;
17 import org.apache.http.protocol.HTTP;
18 import org.json.JSONException;
19 import org.json.JSONObject;
20
21 import android.util.Log;
22
23 public class JSONParser {
24
25 static InputStream is = null;
26 static JSONObject jObj = null;
27 static String json = "";
28 // constructor
29 public JSONParser() {
30 }
31 public JSONObject makeHttpRequest(String url, String method,
32 List<NameValuePair> params) {
33 // Making HTTP request
34 try {
35 //使用POST请求
36 DefaultHttpClient httpClient = new DefaultHttpClient();
37 HttpPost httpPost = new HttpPost(url);
38 httpPost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
39 HttpResponse httpResponse = httpClient.execute(httpPost);
40 HttpEntity httpEntity = httpResponse.getEntity();
41 is = httpEntity.getContent();
42 } catch (UnsupportedEncodingException e) {
43 e.printStackTrace();
44 } catch (ClientProtocolException e) {
45 e.printStackTrace();
46 } catch (IOException e) {
47 e.printStackTrace();
48 }
49 try {
50 BufferedReader reader = new BufferedReader(new InputStreamReader(
51 is, "UTF-8"));
52 StringBuilder sb = new StringBuilder();
53 String line = null;
54 while ((line = reader.readLine()) != null) {
55 sb.append(line + "\n");
56 }
57 is.close();
58 json = sb.toString();
59 } catch (Exception e) {
60 Log.e("Buffer Error", "Error converting result " + e.toString());
61 Log.d("json", json.toString());
62 }
63 //转变为Json类型
64 try {
65 jObj = new JSONObject(json);
66 } catch (JSONException e) {
67 Log.e("JSON Parser", "Error parsing data " + e.toString());
68 }
69 // return JSON String
70 return jObj;
71 }
72
73 }
注意:必要忘了在配置文件添加访问网络权限的代码:
1 <uses-permission android:name="android.permission.INTERNET"/>
布局代码XML:
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools"
3 android:id="@+id/LinearLayout1"
4 android:layout_width="match_parent"
5 android:layout_height="match_parent"
6 android:orientation="vertical"
7 tools:context=".MainActivity" >
8
9
10 <EditText
11 android:id="@+id/edtv"
12 android:layout_width="match_parent"
13 android:layout_height="wrap_content"
14 android:ems="10" >
15
16 <requestFocus />
17 </EditText>
18
19 <EditText
20 android:id="@+id/edt"
21 android:layout_width="match_parent"
22 android:layout_height="wrap_content"
23 android:ems="10" />
24
25 <Button
26 android:id="@+id/bt"
27 android:layout_width="wrap_content"
28 android:layout_height="wrap_content"
29 android:text="提交" />
30
31 </LinearLayout>
服务端代码:
Conn.php(连接数据库的代码):
1 <?php
2 //连接本地数据库localhost以及数据库账户root密码为空
3 $con = mysql_connect("localhost","root","");
4
5 //设置字符集
6 mysql_query("SET NAMES 'utf8'");
7 mysql_query("SET CHARACTER SET utf8");
8
9 if(!$con){
10 die(mysql_error());
11 }
12 mysql_select_db("testregister",$con);
13 // echo "测试成功";
14
15 ?>
操作数据库的代码:
register.php:
1 <?php
2
3 require 'Conn.php';
4
5 $response = array();
6
7 //注意:这里的POST传递的name必须和android端的键一致,否则不会插入数据
8 if(isset($_POST['name'])){
9 $nickname = $_POST['name'];
10 $password = $_POST['password'];
11 //执行Mysql插入语句
12 $query = mysql_query("INSERT INTO test_register(nickname,password) VALUES ('$nickname','$password')");
13 // echo $query;
14 // echo "测试query";
15 if ($query) {
16 // successfully inserted into database
17 $response["success"] = 1;
18 $response["message"] = "Product successfully created.";
19 echo json_encode($response);
20
21 } else {
22 // failed to insert row
23 $response["success"] = 0;
24 $response["message"] = "Oops! An error occurred.";
25 // echoing JSON response
26 echo json_encode($response);
27 }
28
29 }
30
31 ?>
说明:echo只是为了当时测试用的。
如果在执行程序的过程中Logcat中出现下面情况,就差不多对了。
为了测试方便我使用的是英文,如果有使用中文的,上述代码也可以,如果你的不可以的话,你就更改你的编码方式,我这里是用的UTF-8,这是最普遍的,一般不会出现问题。
本人的水平有限,就先写这些了,如果有什么问题,或者更好的方法,还需要大神留言。我感激不尽。