首页 文章 精选 留言 我的

精选列表

搜索[android things],共10000篇文章
优秀的个人博客,低调大师

Android 使用Sqlite

如何使用 继承SQLiteOpenHelper,通过SQLiteOpenHelper可以方便的管理SQLiteDatabase public class MyDataBaseHelper extends SQLiteOpenHelper { public final static String CREATE_TABLE_SQL="create table dict (_id integer primary key autoincrement,word text,detail text)"; public MyDataBaseHelper(Context context, String name, int version) { super(context, name, null, version); } @Override public void onCreate(SQLiteDatabase db) { // 第一次使用数据库是自动建表 db.execSQL(CREATE_TABLE_SQL); } /** * 升级数据是调用 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } } 获取可写数据库:SQLiteDatabase database=databaseHelper.getWritableDatabase(); 获取可读数据库: SQLiteDatabase db=databaseHelper.getReadableDatabase(); 执行SQL语句 db.executeSQL(String sql); db.executeSQL(String sql, Object[] bindArgs);//sql语句中使用占位符,然后第二个参数是实际的参数集 insert db.insert(String table, String nullColumnHack, ContentValues values); 第一个参数都是表示要操作的表名;insert中的第二个参数表示强行插入null值的数据列的列名,当values参数为空或不含任何key-value对时该参数有效;insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;插入方法执行后会返回新添记录的行号,该行号是一个内部值,与主键id无关,发生错误返回-1; 通过SQL语句也可实现:比如:db.execSQL("insert into news_info values(null,?,?)",new String[]{title,content}) update db.update(String table, Contentvalues values, String whereClause, String whereArgs); table:表名 values: 想更新的数据 whereClause:满足whereClause子句的记录将会被更新 whereArgs: 用于为whereClause子句传入参数 例 int result=db.update("news_info",values,"_id>?",new Integer[]{20}); delete db.delete(String table, String whereClause, String whereArgs); table: 表名 whereClause:满足whereClause子句的记录将会被删除 whereArgs: 用于为whereClause子句传入参数 query db.rawQuery(String sql, String[] selectionArgs); db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderB 上面几种都是常用的查询方法,第一种最为简单,将所有的SQL语句都组织到一个字符串中,使用占位符代替实际参数,selectionArgs就是占位符实际参数集;下面的几种参数都很类似,columns表示要查询的列所有名称集,selection表示WHERE之后的条件语句,可以使用占位符,groupBy指定分组的列名,having指定分组条件,配合groupBy使用,orderBy指定排序的列名,limit指定分页参数,distinct可以指定“true”或“false”表示要不要过滤重复值。需要注意的是,selection、groupBy、having、orderBy、limit这几个参数中不包括“WHERE”、“GROUP BY”、“HAVING”、“ORDER BY”、“LIMIT”等SQL关键字。最后,他们同时返回一个Cursor对象,代表数据集的游标,有点类似于JavaSE中的ResultSet。 Cursor c.move(int offset); //以当前位置为参考,移动到指定行 c.moveToFirst(); //移动到第一行 c.moveToLast(); //移动到最后一行 c.moveToPosition(int position); //移动到指定行 c.moveToPrevious(); //移动到前一行 c.moveToNext(); //移动到下一行 c.isFirst(); //是否指向第一条 c.isLast(); //是否指向最后一条 c.isBeforeFirst(); //是否指向第一条之前 c.isAfterLast(); //是否指向最后一条之后 c.isNull(int columnIndex); //指定列是否为空(列基数为0) c.isClosed(); //游标是否已关闭 c.getCount(); //总数据项数 c.getPosition(); //返回当前游标所指向的行数 c.getColumnIndex(String columnName);//返回某列名对应的列索引值 c.getString(int columnIndex); //返回当前行指定列的值

优秀的个人博客,低调大师

Android图文上传

这次介绍下如何使用Retrofit+rxjava上传图片和文字 接口的写法 public interface MarketApiService { @Multipart//这里一定要加这个 @POST("market/addNewOrder") Observable<ResultBean> addNewOrder(@QueryMap Map<String, String> map, @Part MultipartBody.Part pic); } 上传的代码 Map<String, String> params = new HashMap<String, String>(); params.put("ship_type_id", type); params.put("cons_number", consNumber); params.put("note", beizhu); File fileByUri = FileUtil.getFileByUri(imagepath, this); //这里最好写成MediaType.parse("image/*"),之前写成MediaType.parse("image/png")上传失败 RequestBody photoRequestBody = RequestBody.create(MediaType.parse("image/*"), fileByUri); MultipartBody.Part photo = MultipartBody.Part.createFormData("file", fileByUri.getName(), photoRequestBody); RetrofitUtils.getInstance().getApiServier(MarketApiService.class) .addNewOrder(params,photo) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<ResultBean>() { @Override public void accept(ResultBean resultBean) throws Exception { } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { } }); 这里的图片选择器使用的是知乎的图片选择器https://github.com/zhihu/Matisse 另外这里还有将Uri转换为File的工具类(因为知乎图片选择器返回的是Uri) public static File getFileByUri(Uri uri, Context context) { String path = null; if ("file".equals(uri.getScheme())) { path = uri.getEncodedPath(); if (path != null) { path = Uri.decode(path); ContentResolver cr = context.getContentResolver(); StringBuffer buff = new StringBuffer(); buff.append("(").append(MediaStore.Images.ImageColumns.DATA).append("=").append("'" + path + "'").append(")"); Cursor cur = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] { MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA }, buff.toString(), null, null); int index = 0; int dataIdx = 0; for (cur.moveToFirst(); !cur.isAfterLast(); cur.moveToNext()) { index = cur.getColumnIndex(MediaStore.Images.ImageColumns._ID); index = cur.getInt(index); dataIdx = cur.getColumnIndex(MediaStore.Images.ImageColumns.DATA); path = cur.getString(dataIdx); } cur.close(); if (index == 0) { } else { Uri u = Uri.parse("content://media/external/images/media/" + index); System.out.println("temp uri is :" + u); } } if (path != null) { return new File(path); } } else if ("content".equals(uri.getScheme())) { // 4.2.2以后 String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(uri, proj, null, null, null); if (cursor.moveToFirst()) { int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); path = cursor.getString(columnIndex); } cursor.close(); return new File(path); } else { //Log.i(TAG, "Uri Scheme:" + uri.getScheme()); } return null; } 个人博客https://myml666.github.io/

优秀的个人博客,低调大师

Android--WebSocket

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/79625691 WebSocket 是一种双向通信协议,在建立连接后,WebSocket服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Socket一样。它类似TCP长连接,但是WebSocket使用的是ws和wss两种通信协议,所以这是完全不同于HTTP的一种网络协议,尽管它也是默认使用80和443端口。WebSocket的连接包括第一步握手和第二步数据交换。在通过WebSocket开始双向通信时,首先需要与服务器建立连接。而用于建立连接的请求是由客户端发起,服务器端将会确认连接对象的源以及协议,并发送连接许可的响应。在发送了响应之后,浏览器会将该连接升级为WebSocket。握手成功之后就建立起长连接,直到服务器或者浏览器某一方主动断开连接。客户端发起连接非常简单,只需要一句Javascript即可实现: varws=newWebSocket('ws://www.example.com/bar') 然后就是第二步,浏览器和服务器之间双向数据发送了。Nodejs是即时通信应用很完美的开发语言(此处不是为了引起撕逼),很自然地,Nodejs本身也比较完善地实现了WebSocket相关API。客户端(浏览器)发送消息到服务器最简单的方法就是通过调用socket对象的send()方法,然后Node服务器通过注册message事件进行监听,当然服务器send过来的消息也是通过对客户端message事件进行捕捉,从而实现双向的数据交互。这两者之间交换的数据可以是字符串、ArrayBuffer(二进制数据)或者Blob,所以WebSocket也是可以传输文件的。也可以通过广播事件将消息发送到所有连接到服务器的客户端。 使用框架:Java-WebSocket Gradle To use Gradle add the maven central repository to your repositories list : mavenCentral() Then you can just add the latest version to your build. compile "org.java-websocket:Java-WebSocket:1.3.8" Client Example import java.net.URI; import java.net.URISyntaxException; import org.java_websocket.client.WebSocketClient; import org.java_websocket.drafts.Draft; import org.java_websocket.drafts.Draft_6455; import org.java_websocket.handshake.ServerHandshake; public class EmptyClient extends WebSocketClient { public EmptyClient(URI serverUri, Draft draft) { super(serverUri, draft); } public EmptyClient(URI serverURI) { super(serverURI); } @Override public void onOpen(ServerHandshake handshakedata) { send("Hello, it is me. Mario :)"); System.out.println("new connection opened"); } @Override public void onClose(int code, String reason, boolean remote) { System.out.println("closed with exit code " + code + " additional info: " + reason); } @Override public void onMessage(String message) { System.out.println("received message: " + message); } @Override public void onMessage(ByteBuffer message) { System.out.println("received ByteBuffer"); } @Override public void onError(Exception ex) { System.err.println("an error occurred:" + ex); } public static void main(String[] args) throws URISyntaxException { WebSocketClient client = new EmptyClient(new URI("ws://localhost:8887")); client.connect(); } } Server Example import java.net.InetSocketAddress; import org.java_websocket.WebSocket; import org.java_websocket.handshake.ClientHandshake; import org.java_websocket.server.WebSocketServer; public class SimpleServer extends WebSocketServer { public SimpleServer(InetSocketAddress address) { super(address); } @Override public void onOpen(WebSocket conn, ClientHandshake handshake) { conn.send("Welcome to the server!"); //This method sends a message to the new client broadcast( "new connection: " + handshake.getResourceDescriptor() ); //This method sends a message to all clients connected System.out.println("new connection to " + conn.getRemoteSocketAddress()); } @Override public void onClose(WebSocket conn, int code, String reason, boolean remote) { System.out.println("closed " + conn.getRemoteSocketAddress() + " with exit code " + code + " additional info: " + reason); } @Override public void onMessage(WebSocket conn, String message) { System.out.println("received message from " + conn.getRemoteSocketAddress() + ": " + message); } @Override public void onMessage( WebSocket conn, ByteBuffer message ) { System.out.println("received ByteBuffer from " + conn.getRemoteSocketAddress()); } @Override public void onError(WebSocket conn, Exception ex) { System.err.println("an error occured on connection " + conn.getRemoteSocketAddress() + ":" + ex); } @Override public void onStart() { System.out.println("server started successfully"); } public static void main(String[] args) { String host = "localhost"; int port = 8887; WebSocketServer server = new SimpleServer(new InetSocketAddress(host, port)); server.run(); } } 还有一个封装框架挺好:RxWebSocket how to use 添加依赖: 在项目module下gradle加入: //本项目 compile 'com.dhh:websocket:1.5.0' init //if you want to use your okhttpClient OkHttpClient yourClient = new OkHttpClient(); RxWebSocketUtil.getInstance().setClient(yourClient); // show log,default false RxWebSocketUtil.getInstance().setShowLog(true); WSS support,其实就是设置okhttp的SSL,请参照okhttp的设置 //wss support RxWebSocketUtil.getInstance().setSSLSocketFactory(yourSSlSocketFactory,yourX509TrustManager); RxWebSocketUtil.getInstance().getWebSocket("wss://..."); //or OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(yourSSlSocketFactory, yourX509TrustManager) //other config... .build(); RxWebSocketUtil.getInstance().setClient(client); open WebSocket RxWebSocketUtil.getInstance().getWebSocketInfo(url) .subscribe(new Action1<WebSocketInfo>() { @Override public void call(WebSocketInfo webSocketInfo) { mWebSocket = webSocketInfo.getWebSocket(); Log.d("MainActivity", webSocketInfo.getString()); Log.d("MainActivity", "webSocketInfo.getByteString():" + webSocketInfo.getByteString()); } }); mWebSocket.send("hello word"); // use WebSocketSubscriber RxWebSocketUtil.getInstance().getWebSocketInfo("ws://10.7.5.88:8089") //RxLifecycle : https://github.com/dhhAndroid/RxLifecycle .compose(RxLifecycle.with(this).<WebSocketInfo>bindOnDestroy()) .subscribe(new WebSocketSubscriber() { @Override public void onOpen(@NonNull WebSocket webSocket) { } @Override public void onMessage(@NonNull String text) { } @Override public void onMessage(@NonNull ByteString bytes) { } }); // use WebSokcetAction1 RxWebSocketUtil.getInstance().getWebSocketInfo("ws://10.7.5.88:8089") //RxLifecycle : https://github.com/dhhAndroid/RxLifecycle .compose(RxLifecycle.with(this).<WebSocketInfo>bindOnDestroy()) .subscribe(new WebSokcetAction1() { @Override public void onOpen(@NonNull WebSocket webSocket) { } @Override public void onMessage(@NonNull String text) { } @Override public void onMessage(@NonNull ByteString bytes) { } }); //get StringMsg RxWebSocketUtil.getInstance().getWebSocketString(url) .subscribe(new Action1<String>() { @Override public void call(String s) { } }); // get ByteString RxWebSocketUtil.getInstance().getWebSocketByteString(url) .subscribe(new Action1<ByteString>() { @Override public void call(ByteString byteString) { } }); //get WebSocket RxWebSocketUtil.getInstance().getWebSocket(url) .subscribe(new Action1<WebSocket>() { @Override public void call(WebSocket webSocket) { } }); //with timeout RxWebSocketUtil.getInstance().getWebSocketInfo(url, 10, TimeUnit.SECONDS) .subscribe(new Action1<WebSocketInfo>() { @Override public void call(WebSocketInfo webSocketInfo) { } }); // Rxbinding RxView.clicks(centect) .flatMap(new Func1<Void, Observable<String>>() { @Override public Observable<String> call(Void aVoid) { return RxWebSocketUtil.getInstance().getWebSocketString(url); } }) .subscribe(new Action1<String>() { @Override public void call(String s) { //the s !=null Log.d("MainActivity", s); textview.setText(Html.fromHtml(s)); } }); 发送消息 //用WebSocket的引用直接发 mWebSocket.send("hello word"); //url 对应的WebSocket已经打开可以这样send,否则报错 RxWebSocketUtil.getInstance().send(url, "hello"); RxWebSocketUtil.getInstance().send(url, ByteString.EMPTY); //异步发送,若WebSocket已经打开,直接发送,若没有打开,打开一个WebSocket发送完数据,直接关闭. RxWebSocketUtil.getInstance().asyncSend(url, "hello"); RxWebSocketUtil.getInstance().asyncSend(url, ByteString.EMPTY); 注销 RxJava的注销方式,就可以取消订阅. 项目里的demo里,简单实现了一个Lifecycle.仅供参考. Subscription subscription = RxWebSocketUtil.getInstance().getWebSocketString("ws://sdfs").subscribe(); //注销 if(subscription!=null&&!subscription.isUnsubscribed()) { subscription.unsubscribe(); }

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册