首页 文章 精选 留言 我的

精选列表

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

Android GIS开发系列-- 入门季(10) MapView快速定位到Geometry

我们知道某个Geometry的坐标,但不知道具体的位置,该如何使地图快速定位呢?这时需要用到MapView.setExtent方法,来看下这个方法的介绍:Zooms the map to the given geometry so that geometry fits within the bounds of the map.大体的意思即缩小地图定位到Geometry。上代码: public class MainActivity extends Activity { private MapView mapView; private GraphicsLayer graphicsLayer; private static final String TILED_WORLD_STREETS_URL = "http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.map_view); mapView.addLayer(new ArcGISTiledMapServiceLayer(TILED_WORLD_STREETS_URL)); findViewById(R.id.location).setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { //快速定位到线 Polyline polyline = new Polyline(); polyline.startPath(new Point(110, 23)); polyline.lineTo(new Point(115, 25)); //由于加载的地图是墨卡托坐标,这里需要转坐标 Polyline polyline2 = (Polyline) GeometryEngine.project(polyline, SpatialReference.create(SpatialReference.WKID_WGS84), SpatialReference .create(SpatialReference.WKID_WGS84_WEB_MERCATOR)); mapView.setExtent(polyline2); } }); initLayer(); } /** * 添加一条线 */ private void initLayer() { graphicsLayer = new GraphicsLayer(); mapView.addLayer(graphicsLayer); Polyline polyline = new Polyline(); polyline.startPath(new Point(110, 23)); polyline.lineTo(new Point(115, 25)); //由于加载的地图是墨卡托坐标,这里需要转坐标 Polyline polyline2 = (Polyline) GeometryEngine.project(polyline, SpatialReference.create(SpatialReference.WKID_WGS84), SpatialReference .create(SpatialReference.WKID_WGS84_WEB_MERCATOR)); graphicsLayer.addGraphic(new Graphic(polyline2, new SimpleLineSymbol( Color.RED, 3, SimpleLineSymbol.STYLE.SOLID))); } } 没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。 本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/7751971.html,如需转载请自行联系原作者

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

Android基础:SQLites数据库事物处理的优越性

一直知道数据库的事物处理,但是自己始终在写数据库操作时,总是默认的回避了这件事,想想还是要自己做个测试来让自己警醒,记住数据库事物是非常必要地。 测试结果是:单单一千条数据,在对sqlite数据库进行操作时,使用事物和不适用事物前后相差78倍之多,不难想象大数据增加时如果没有事物处理的意识,对软件性能来说只能是灾难性的。 setContentView(R.layout.main); helper = new MyOpenDbHelper( this ); button = (Button) findViewById(R.id.bt); button.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { // 未使用同一个事物处理:57013ms // 使用同一个事物处理:730ms, 仅仅一千条数据,却前后相差78倍之多,可见事物的重要性 // 对表数据进行增加、删除、更新的时候最好时候事物处理, SQLiteDatabase writableDatabase = helper.getWritableDatabase(); time = System.currentTimeMillis(); writableDatabase.beginTransaction(); for ( int i= 0 ; i< 1000 ; i++) { String sql = "insert into myTab values (" + i + "," + i + "," + "'tom'" + ")" ; System.out.println(sql); writableDatabase.execSQL(sql); } writableDatabase.setTransactionSuccessful(); writableDatabase.endTransaction(); System.out.println(System.currentTimeMillis() - time); } }); 本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/archive/2012/11/06/2757978.html如需转载请自行联系原作者 demoblog

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

[Android]AndroidInject增加sqlite3数据库映射注解(ORM)

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3623050.html AndroidInject项目是我写的一个使用注解注入来简化代码的开源项目 https://github.com/wangjiegulu/androidInject 今天新增功能如下: 1. 增加对sqlite3数据库的orm注解支持,增加@AIColumn、@AIPrimaryKey、@AITable三个注解来映射到表(有待改进) 2. 使用反射来封装AIDbExecutor类,实现半自动化orm,类似mybatis 先说说使用的方式吧 一. 新建DatabaseHelper,继承AIDatabaseHelper(AndroidInject提供,直接继承了SQLiteOpenHelper),在onCreate中调用如下方法来新建表user: @Override public void onCreate(SQLiteDatabase db) { AIDbUtil.createTableIfNotExist(db, "create table user(uid INTEGER PRIMARY KEY AUTOINCREMENT, " + "username varchar(20), " + "password varchar(20), " + "createmillis long, " + "height float, " + "weight double)", "user"); } 其中方法createTableIfNotExist (SQLiteDatabase db, String sql, String tableName) 用于新建表,如果存在该表,则不创建 二. 既然是ORM,不管怎么样,总要在表与持久层对象之间映射,所以新建表完毕之后,就要新建类User: 1 /** 2 * Created with IntelliJ IDEA. 3 * Author: wangjie email:tiantian.china.2@gmail.com 4 * Date: 14-3-25 5 * Time: 上午10:04 6 */ 7 @AITable("user") 8 public class User implements Serializable{ 9 @AIColumn 10 @AIPrimaryKey(insertable = false) 11 private int uid; 12 @AIColumn("username") 13 private String username; 14 @AIColumn 15 private String password; 16 @AIColumn 17 private long createmillis; 18 @AIColumn 19 private float height; 20 @AIColumn 21 private double weight; 22 23 private String notCol; 24 // getter/setter... 25 } 如上面的代码所示: @AITable类注解,用于映射类到表, value()表示要映射到的表的名称,不填写或未增加该注解则默认以类名小写为表名 @AIPrimaryKey属性注解,用于指定属性为主键,insertable()表示插入数据时是否同时也插入主键到表。默认为false,即表的主键应该为自动生成 @AIColumn属性注解,用于映射属性到表字段,value()表示要映射到的表字段名称,不填写则默认以属性名作为表字段名 这样,类和表之间就用以上的几个注解进行了映射。 三. AndroidInject提供了一个AIDbExecutor抽象类来对表数据进行操作,使用时需要自己编写一个DbExecutor来继承AIDbExecutor,并实现obtainDbHelper()方法,用于提供给DbExecutor一个AIDatabaseHelper。如下: 1 public class DbExecutor<T> extends AIDbExecutor<T>{ 2 private final static String TAG = DbExecutor.class.getSimpleName(); 3 public final static String DB_NAME = "androidinject_db"; 4 public final static int VERSION = 1; 5 6 public DbExecutor(Context context) { 7 super(context); 8 } 9 10 @Override 11 public AIDatabaseHelper obtainDbHelper() { 12 return new DatabaseHelper(context, DB_NAME, VERSION); 13 } 14 15 16 } 接下来就可以直接使用AIDbExecutor来进行数据库的操作了,如下: // 创建一个用于操作user表的dbExecutor对象 AIDbExecutor<User> userExecutor = new DbExecutor<User>(context); // 插入一条user数据: User dbUser = new User("wangjie" + rd.nextInt(10000), String.valueOf(rd.nextInt(10000) + 10000), System.currentTimeMillis(), rd.nextInt(80) + 120, rd.nextInt(80) + 120, "aaaa"); userExecutor.executeSave(dbUser); // 查询user表 List<User> users = userExecutor.executeQuery("select * from user where uid > ?", new String[]{"4"}, User.class); // 删除user表中的一条数据 userExecutor.executeDelete(users.get(0)); // 更新user表中的一条数据 User user = users.get(0); user.setUsername(user.getUsername().startsWith("wangjie") ? "jiewang" + rd.nextInt(10000) : "wangjie" + rd.nextInt(10000)); user.setPassword(user.getPassword().startsWith("123456") ? "abcdef" : "123456"); user.setCreatemillis(System.currentTimeMillis()); user.setHeight(rd.nextInt(80) + 120); user.setWeight(rd.nextInt(80) + 120); user.setNotCol("bbb"); userExecutor.executeUpdate(user, null, new String[]{"createmillis"}); 四. AIDbExecutor类中提供的方法有: 1. public List<T> executeQuery(String sql, String[] selectionArgs, Class<?> clazz) throws Exception; 用于查询表,并自动封装到List<T>中,告别Cursor 2.public int executeSave(final T obj) throws Exception; 用于保存一条数据 3.public int executeUpdate(final T obj, final String[] includeParams, final String[] excludeParams) throws Exception; 用于更新一条数据,更新数据时,是根据主键去更新其他字段的。可以对其他要更新的字段进行包含和排除(填写类的属性)。 注意:包含在includeParams,并且不包含在excludeParams中才会被更新。 4.public int executeDelete(final T obj) throws Exception; 删除一条数据,根据主键删除一条数据 5.public void executeSql(String sql, Object[] selectionArgs) throws Exception; 执行一条sql语句(insert、update、delete) 6. 同时提供了生成SQLiteDatabase对象的方法 public SQLiteDatabase getReadableDatabase(); public SQLiteDatabase getWritableDatabase(); 本文转自天天_byconan博客园博客,原文链接:http://www.cnblogs.com/tiantianbyconan/p/3623050.html ,如需转载请自行联系原作者

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

Android应用开发—eventBus发布事件和事件处理的时序关系

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/78334378 占坑,简单说明下eventBus发布事件和事件处理的时序关系。 什么时候使用sticky: 当你希望你的事件不被马上处理的时候,举个栗子,比如说,在一个详情页点赞之后,产生一个VoteEvent,VoteEvent并不立即被消费,而是等用户退出详情页回到商品列表之后,接收到该事件,然后刷新Adapter等。其实这就是之前我们用startActivityForResult和onActivityResult做的事情。

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

[Android App]IFCTT,即:If Copy Then That,一个基于IFTTT的"This"实现

IFCTT,即:If Copy Then That,是一个基于IFTTT(If This Then That)的"This"实现,它打通了"用户手机端操作"与"This条件触发"之间的桥梁,让这个过程更具方便性和快捷性。通过手机端的Copy动作,以"Tagged Email"的方式连接到IFTTT,从而触发IFTTT中所有支持的"That"行为。用户只需要复制然后选择触发IFTTT的"Hash Tag"即可,它支持用户配置多种"Hash Tag"来进行多种自定义方式内容传输,比如: 手机端执行拷贝Url地址(随时随地,任何地方,如Twitter/Facebook/Instagram/wechat/weibo/blog...),一键通过IFCTT & IFTTT,保存链接对应的文章到Instapaper/Pocket,最低成本实现Read it later 手机端执行拷贝文章内容,一键通过IFCTT & IFTTT,保存发送对应的内容到Evernote/Google doc/kindle... 等等 使用IFCTT需要以下几个条件: 你需要拥有IFTTT账号,并开启相应的Applets 你需要使用与IFTTT相同的Email账号在IFCTT中进行smtp授权和配置 首先,下载安装IFCTT App(12月21日~12月28日圣诞节免限中): Google Play:https://play.google.com/store/apps/details?id=com.wangjie.ifctt IFCTT Email配置 根据你在IFTTT使用的邮箱来进行配置(推荐使用Gmail) 1. Gmail邮箱配置 1.1 生成应用专用密码 首先需要为IFCTT生成一个App专用密码,打开以下链接并登陆Google账号: https://support.google.com/accounts/answer/185833 选择app为Mail: 选择设备为Other (Custom name): 然后在输入框中填入IFCTT: 然后,点击GENERATE: 以上黄色区域中的16个字符的密码就是我们需要的专用密码,选中复制 1.2 在IFCTT中配置Gmail 打开IFCTT,进入Settings->Email Configuration并填写相关信息: 注意: password:为1.1 生成应用专用密码中生成的应用专用密码Extra properties:如果你使用的是Gmail邮箱,则内容不需要改动,保持最初始的状态即可 怎么使用IFCTT自带默认的Hash tags 在安装完IFCTT之后,首次进入,app会自动帮你创建以下5个默认的Hash tags: #instapaper:这个标签会使得当你复制了文本内容时,此标签会识别当前复制的内容,如果是链接,则通过IFTTT推送到你的instapaper #box:这个标签会使得当你复制了文本内容时,此标签会通过IFTTT推送到你的box,把内容追加保存在box的路径为IFTTT/Email/IFCTT的文件中 #evernote:这个标签会使得当你复制了文本内容时,此标签会通过IFTTT推送到你的evernote,把内容追加保存在evernote的名为IFTTT/Email/IFCTT的文件中 #pocket:这个标签会使得当你复制了文本内容时,此标签会识别当前复制的内容,如果是链接,则通过IFTTT推送到你的pocket #googledoc:这个标签会使得当你复制了文本内容时,此标签会通过IFTTT推送到你的google docs,把内容追加保存在google docs的名为IFTTT/Email/IFCTT的文件中 第一次进入后,所有的Hash tags都是默认OFF状态的,如下图所示: 下面以开启instapaper这个Hash tag为例 首先点击进入#instapaper的编辑页面,如下图: 首先如上图中,先点击开启按钮 然后因为默认的Hash tag所对应的IFTTT Applet都已经创建好了,所以可以直接进入IFTTT的Applet界面添加并开启,如上图,点击红色字体部分或者IFTTT的图标,将会打开如下IFTTT的Applet界面: 点击开启图标,这时IFTTT可能会让你绑定你的instapaper账号,按照流程正常绑定即可(如果以前已经绑定过了则不需要再次绑定),操作完毕后,IFTTT的instapaper applet就会开启。 最后返回到IFCTT#instapaper的编辑页面,点击右上角进行保存,成功后回到首页,instapaper的card将会变成彩色。 其他IFCTT自带默认的Hash tags开启方式都类似。 创建自定义的Hash tags 除了使用IFCTT提供的默认Hash tags之外,你还可以创建自己的Hash tags,现在我们来创建一个Hash tags实现如下功能: 当你复制了一段文字后,点击此标签后,自动通过IFTTT在你的`Twitter`上发送一条推特 点击首页右上角的+按钮,添加一个Hash tag, 如上,填写tag为twitter(可以自己任意填写)和note(任意填写),除了填写以上信息,还需要在IFTTT中创建对应的IFTTT Applet,点击上图红色字或者IFTTT的图标,即会进入到IFTTT界面,点击下图顶部的+按钮来创建IFTTT Applet: this(trigger)选择Email,并选择Send IFTTT an email tagged(必须): 上图中的Tag输入为twitter(必须要与IFCTT中的一致!), that(action)选择Twitter,并选择Post a tweet,然后设置如下: 上面中的body就是指的就是IFCTT中的复制内容 提交成功后,返回到IFCTT中的创建页面提交,这时Hash tag创建成功 本文转自天天_byconan博客园博客,原文链接:http://www.cnblogs.com/tiantianbyconan/p/8075738.html,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册