网络连接考虑复用性一般我们将网络连接的具体方法都放到一个类中,例如HttpConnection类中。我们以volley的连接方式为例进行讲解。
1)HttpConnection必须是单例模式,避免多次建立网络连接。
2)volley的连接方式可以有效的避免多次发送服务请求,但是不可以避免多次建立RequestQueue。所以我们还要建立一个类用单例的模式获得RequestQueue。例如Single
3)由于网络连接是要在服务器中获得数据,并且现实在UI中。所以我们还要用观察这模式。建立一个接口在接口中建立三个方法。分别是在网络成功后,失败后,无网络连接的时候调用的方法。
4)在网络请求调用的时候我们希望一看到这个方法我们就知道这是干什么用的,所以我们可以将所有的网络请求的不同类型写不同的方法。为了便于管理我们将所有的方法都放到一个类中进行管理。例如:MyAllConnectMathod。
具体的代码如下:
HttpConnection类的代码:
public class HttpConnection {
//这个类主要用于对网络连接的操作,方面以后调用。
//这个必须是单例的,防止建立多个
private static HttpConnection sigle;
private HttpConnection() {
}
public synchronized static HttpConnection getInstence(){
if(sigle==null){
sigle = new HttpConnection();
}
return sigle;
}
public interface OnHttpConnectionListener{
public void onNullNet();
public void onFaliNet();
public void onSuccessNet(String response);
}
public void addRequest(String url, final HashMap map, final OnHttpConnectionListener onHttpConnectionListener){
// RequestQueue queue = Volley.newRequestQueue(BaseApplication.getmContext());
RequestQueue queue = single.getInstence().getQueue();//建立一个相应队列
//建立一个响应,第一个参数为;响应方法:POST,GET。第二个参数为Url,第三个为:响应成功时执行,第四个为失败时执行
StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener() {
@Override
public void onResponse(String response) {
onHttpConnectionListener.onSuccessNet(response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
onHttpConnectionListener.onFaliNet();
}
});
queue.add(request);//将响应加入响应队列
}
}
single类代码:
public class single {
private static single msingle;
private RequestQueue queue;
private single(Context context) {
queue = Volley.newRequestQueue(context);
}
public synchronized static single getInstence(){
if(msingle==null){
msingle = new single(BaseApplication.getmContext());
}
return msingle;
}
public RequestQueue getQueue() {
return queue;
}
}
MyAllConnectMathod 类代码:
public class MyAllConnectMathod {
public static void Login(String uri,HashMap map,OnHttpConnectionListener onHttpConnectionListener){
HttpConnection.getInstence().addRequest(uri,null,onHttpConnectionListener);
}
}
Activity中的代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private TextView textView;
private Button select;
private Button mDelete;
private Button mUpdate;
StringBuilder s;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.text);
select = (Button) findViewById(R.id.mselect);
mDelete = (Button) findViewById(R.id.mdelete);
mDelete.setOnClickListener(this);
select.setOnClickListener(this);
/**
* 网络连接
*/
MyAllConnectMathod.Login("http://192.168.0.43:8080/www/MyserverTest", null, new HttpConnection.OnHttpConnectionListener() {
@Override
public void onNullNet() {
textView.setText("连接错误");
}
@Override
public void onFaliNet() {
textView.setText("连接错误");
}
@Override
public void onSuccessNet(String response) {
try {
//获得json字符串并用Gson进行解析
JSONObject object = new JSONObject(response);
JSONArray array = object.getJSONArray("date");
ArrayList lists = (ArrayList) GsonUtils.readJsinArray(array, WorkDaily.class);
SQLiteDatabase db = DBmanager.getInstenec().getDb();
DbUtils utils = DbUtils.create(BaseApplication.getmContext(),"MY_BAS.db");
utils.saveAll(lists);//保存数据到本地数据库
} catch (JSONException e) {
e.printStackTrace();
} catch (DbException e) {
e.printStackTrace();
}
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.mselect:
dateSelect();
break;
case R.id.mdelete:
TableOperator.getDelete(WorkDaily.class);
break;
}
}
private void dateSelect() {
ArrayList arrayList = (ArrayList) TableOperator.getList("user", WorkDaily.class);
StringBuilder ss =new StringBuilder();
for (int i =0;i
数据库的基本操作就是增删改查。
1)数据库的建立,这里我用SQLiteOpenHelper建立数据库。代码如下:
public class MySqlHelper extends SQLiteOpenHelper {
public MySqlHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public MySqlHelper(Context context, String name ){
this(BaseApplication.getmContext(),name,null,1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists user(id integer primary key autoincrement,time varchar(20),num varchar(20))");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2)一般讲数据库的名字,数据表的名字,以及字段的名字放到一个configure类中。代码如下:
public class Configure {
public static String TABLE =”user”;
}
3)数据库的建立为了避免多次建立数据库,一般在一个单例的类中建立。例如DBmanager。代码如下:
public class DBmanager {
private static DBmanager dBmanager;
SQLiteDatabase db;
private DBmanager() {
MySqlHelper helper = new MySqlHelper(BaseApplication.getmContext(),"MY_BAS.db");
db =helper.getWritableDatabase();
}
public static DBmanager getInstenec(){
if (dBmanager==null){
dBmanager = new DBmanager();
}
return dBmanager;
}
public SQLiteDatabase getDb() {
return db;
}
}
4)数据库的具体操作:增删改查。四个方法都放到一个类中,例如:TableOperator类。一般我们用DbUtils对数据库进行操作。DbUtils需要一个类作为数据操作的载体。这个类中包括所有的包中的字段,set和get方法。用注解标注表示的那个表。以及id的注解。代码如下:
WorkDaily类的代码:
@Table(name = "user")//标注好表名
public class WorkDaily {
@Column(column = "id")//说明这是主键。
private String id;
private String time;
private String num;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
}
这样WorkDaily类就与表中的数据建立了联系,可以用DbUtils操作数据库的表了。
TableOperator代码如下:
public class TableOperator {
public static List getList(String Tablename,Class entityType ){
SQLiteDatabase db = DBmanager.getInstenec().getDb();
// Cursor cursor =db.rawQuery("select * from " + Tablename + "", null);
// ArrayList arrayList = new ArrayList();
DbUtils utils = DbUtils.create(BaseApplication.getmContext(),"MY_BAS.db");
try {
List list = (ArrayList) utils.findAll(Selector.from(entityType));
return list;
} catch (DbException e) {
e.printStackTrace();
}
//这是用cursor获得数据的方法
// cursor.moveToFirst();
// while (!cursor.isAfterLast()){
// try {
// T t = entityType.newInstance();
// for(int i =0;i
// String content = cursor.getString(i);
// String columnName = cursor.getColumnName(i);
// Field field = entityType.getDeclaredField(columnName);
// field.setAccessible(true);
// field.set(t,content);
// field.setAccessible(false);
// }
// cursor.moveToNext();
// arrayList.add(t);
// } catch (InstantiationException e) {
// e.printStackTrace();
// } catch (IllegalAccessException e) {
// e.printStackTrace();
// } catch (NoSuchFieldException e) {
// e.printStackTrace();
// }
// }
return null;
}
//增
public static void getInsert(Map map){
SQLiteDatabase db = DBmanager.getInstenec().getDb();
// ContentValues values =new ContentValues();
// map.get("name");
// values.put("name",map.get("name")+"");
// values.put("password",map.get("password")+"");
// db.insert("user",null,values);
DbUtils utils = DbUtils.create(BaseApplication.getmContext(),"MY_BAS.db");
WorkDaily workDaily2 = new WorkDaily();
//
// workDaily2.setName("pp");
// workDaily2.setPassword("111");//增加
try {
utils.save(workDaily2);
} catch (DbException e) {
e.printStackTrace();
}
}
public static void getDelete(Class entityType){
SQLiteDatabase db = DBmanager.getInstenec().getDb();
DbUtils utils = DbUtils.create(BaseApplication.getmContext(),"MY_BAS.db");
try {
utils.delete(entityType, WhereBuilder.b("num", "=","2"));
} catch (DbException e) {
e.printStackTrace();
}
}
public static void getupdate(){
SQLiteDatabase db = DBmanager.getInstenec().getDb();
// db.delete(tablename,"name = ?",new String[]{name});
DbUtils utils = DbUtils.create(BaseApplication.getmContext(),"MY_BAS.db");
WorkDaily workDaily2 = new WorkDaily();
//
// workDaily2.setName("pp");
try {
utils.update(workDaily2, WhereBuilder.b("name", "=", "ppp"), "name");
} catch (DbException e) {
e.printStackTrace();
}
}
}
这样就可以对数据库进行操作了。
DbUtils db = DbUtils.create(BaseApplication.getContext(),"my.db");//创建数据库
db .createTableIfNotExist(Mypp.class);//创建表格