`
RednaxelaFX
  • 浏览: 3016242 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

Android…又摸出来玩了下。

阅读更多
上次摸Google Android的模拟器已经是去年这玩意刚发布没多久的时候了。嘛,本来我也没太着急在Android上做开发。这个学期开学之后,我们这边的毕业设计也正式开始了。
邵栋老师带了几个组是做Android应用程序开发的课题的。正好附近两个宿舍都有人是做这个课题的。语仔他们组想做的是一个*个人理财软件*,之前就在国内的一些Android开发论坛到处看啊找啊,在学习相关技术知识。不过前几天碰到了很奇怪的NullPointerException,问我怎么办。这样我也就又摸出Android来玩了。

正好3月3号Google更新了Android SDK到m5-rc15,而我之前用的SDK都不记得是m多少的了(m3?),干脆就连SDK和Eclipse+ADT都一并更新过来。
Eclipse官网去看,现在的版本已经到3.3.2了。正好连机上的别的Eclipse也一起更新。先是下了Eclipse Classic 3.3.2,结果到安装ADT的时候出现require "org.eclipse.wst.sse.ui"的错误。很明显是要装WTP了。以前装过的老版本的ADT明明不需要的……
装WTP就得连什么GEF啊之类的一堆东西都分别装上。嫌麻烦,就重新下了个Eclipse IDE for Java Developers。然后安装ADT就没问题了。

顺带记下官网对于安装ADT插件的说明:
引用
To download and install the ADT plugin, follow the steps below.

[list]
  • Start Eclipse, then select Help > Software Updates > Find and Install....
  • In the dialog that appears, select Search for new features to install and press Next.
  • Press New Remote Site.
  • In the resulting dialog box, enter a name for the remote site (e.g. Android Plugin) and enter this as its URL:
  • https://dl-ssl.google.com/android/eclipse/

    Press OK.
  • You should now see the new site added to the search list (and checked). Press Finish.
  • In the subsequent Search Results dialog box, select the checkbox for Android Plugin > Developer Tools. This will check both features: "Android Developer Tools", and "Android Editors". The Android Editors feature is optional, but recommended. If you choose to install it, you need the WST plugin mentioned earlier in this page.
  • Now press Next.
  • Read the license agreement and then select Accept terms of the license agreement, if appropriate. Press Next.
  • Press Finish.
  • The ADT plugin is not signed; you can accept the installation anyway by pressing Install All.
  • Restart Eclipse.
  • After restart, update your Eclipse preferences to point to the SDK directory:

  • 1. Select Window > Preferences... to open the Preferences panel. (Mac OS X: Eclipse > Preferences)
    2. Select Android from the left panel.
    3. For the SDK Location in the main panel, press Browse... and locate the SDK directory.
    4. Press Apply, then OK.[/list]


    ===========================================================================

    关于某NPE问题

    OK,东西都装上了,开始解决问题。之前语仔遇到的NPE是基于这样的代码:
    /src/com/my/MyActivity.java:
    package com.my;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class MyActivity extends Activity {
        private EditText edAdmin = null;
        private EditText edPassword = null;
        private Button confirm = null;
    
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.main);
            
            edAdmin = (EditText) findViewById(R.id.Admin);
            edPassword = (EditText) findViewById(R.id.Password);
            confirm = (Button) findViewById(R.id.confirm);
    
            confirm.setOnClickListener(o);
        }
    
        private OnClickListener o = new OnClickListener() {
            public void onClick(View v) {
                //...
            }
        };
    }

    /res/layout/main.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Hello World, MyProject"
        />
    
    <TextView
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Admin1"
        />
    <EditText id="@+id/Admin"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        />
        
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="Admin2"
        />
    <EditText id="@+id/Password"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        />
    <Button id="@+id/confirm"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="confirm"
        />
    </LinearLayout>


    这代码看起来似乎没什么问题。我之前又没怎么看过Android的教程或者文档之类的东西,觉得不知道该从何入手。总之第一能想到的就是看看stack trace;但当在Android里遇到异常时,它就这么在屏幕上显示个简单的提示:

    (这图是我另外开的一个project,故意引发了一个NPE而已……)
    感觉好可怜,啥也看不出来。

    然后查了下如何向输出写自定义的log,发现android.util.Log类可以做这件事。用Log.v(/*String*/tag, /*String*/message, /*Throwable*/obj)就能把日志写出来。这个静态的Log.v()方法用于输出VERBOSE级日志,其中包括了stack trace。输出的目标是logcat。
    那么把前面的Java代码中onCreate()方法里的内容整个用try-block包起来,然后catch Exception并将异常状况写到log里。然后运行……没看到NPE了,但那个按钮里的代码却没起作用。在Eclipse里的output窗口也没看到任何log,超郁闷。

    没办法,又查了下如何查看日志。发现在android_sdk/tools目录有一个叫DDMS的程序。执行它,并且执行其中的logcat就能看到日志。于是终于看到了那个NPE的位置:在onCreate()方法中的confirm.setOnClickListener(o);这行。
    接下来,在onCreate()方法里另外加了句log,当o为null的时候输出一句话;然后没看到输出。这才发现confirm是null……觉得超诡异,大家都是这么findViewById()来得到layout中指定的UI组件的引用,这里怎么会null了呢。

    然后才发觉在M3到M5的变化的文档中有提到,原本在layout的XML文件里的id的属性,要改为使用前缀的android:id。于是把main.xml改过来,就好了
    T T

    更详细的API变化,看这里:http://code.google.com/android/migrating/m3-to-m5/changes.html

    ===========================================================================

    关于模拟器总是disconnect的问题

    语仔从Eclipse运行Android模拟器的时候总是会出现disconnected现象,非得多run几次才好。我也不知道是为什么。
    不过后来发觉实在不行的话就干脆不要从Eclipse启动模拟器了……直接“热安装”就是
    在Eclipse里把代码写好,保存了之后,这么做:
    1. 任意启动一个Android模拟器进程,在“热安装”之前最好让它处于home状态
    2. 在命令行,转到项目的/bin目录,然后用adb直接把程序装上去:
    adb install yourProject.apk

    3. 程序已经“热安装”完成。可以从Android界面里的ALL那边运行新装的程序看看

    装新的apk或者更新旧的apk都可以这样……至少,只要有一次能正常从Eclipse启动模拟器的话,就让它一直开着,然后不停把修改过的apk文件这么“热安装”上去就行了……
    =_=|||

    ===========================================================================

    关于log的问题

    前天给语仔找NPE的原因时,傻乎乎的另外开了一个DDMS来监视logcat的日志。我应该更加信赖ADT的……
    实际上在Eclipse装了ADT之后,在Windows > Preferences > Android > DDMS > Advanced里就可以设置监听log的等级。把等级设到Verbose就能看到全部的log了。我是用Log.v()来输出的,所以不调到这个等级就看不到之前写的那log。诶,果然还是应该多看看文档再说的。

    ===========================================================================

    关于Notepad Tutorial

    Google Android官网上有个不错的教程,Tutorial: A Notepad Application。跟着这个教程走就能了解到Android开发中的许多重要方面,像是Activity的使用(包括sub activity的使用),Intent的使用,SQLite的使用,使用XML的layout、resource、manifest,整个应用程序的流程/生命周期(life-cycle)等。我也跟着这个教程做了一遍,做到Notepad v3。下面这张是运行的截图:


    关于life-cycle,这几个方法很重要:
    // Called when the activity is first created.
    public void onCreate(Bundle icicle)
    
    // called by Android if the Activity is being stopped and may be killed before it is resumed!
    // complement of onCreate()
    protected void onFreeze(Bundle outState)
    
    // called when the Activity ends
    // should release any resources that can be released
    protected void onPause()
    
    // complement of onPause()
    protected void onResume()


    当然这个地方说得更详细一些:Life Cycle of an Android Application

    ===========================================================================

    关于卸载Android模拟器中已经安装了的程序

    在启动了一个Android模拟器进程之后,在命令行使用adb来卸载已经安装的程序:(一定要启动至少一个模拟器实例)
    D:\android\android-sdk_m5-rc15_windows\tools>adb shell
    # cd /data/app
    cd /data/app
    # ls
    ls
    Notepadv3.apk
    ApiDemos.apk
    Notepadv1.apk
    Notepadv2.apk
    # rm Notepadv1.apk
    rm Notepadv1.apk
    # rm Notepadv2.apk
    rm Notepadv2.apk
    # exit
    exit

    这样就把前面装的Notepad v1和v2都卸载了。清爽。

    ===========================================================================

    其它

    不知道实际的Dalvik VM在手机上跑速度如何呢,在模拟器上感觉还可以。只是模拟器的启动时间总是很长……
    不过在我的机上跑模拟器明显比在语仔机上要快。不知道是不是因为我这边没怎么装游戏的缘故……
    呵呵,开发机与游戏机总是无法并存的,除非开发的就是游戏……|||
    7
    7
    分享到:
    评论
    4 楼 RednaxelaFX 2008-03-08  
    惭愧,一开始没想debug,一个是因为对Andriod SDK/ADT还不熟悉,另一个是很多时候看看log也就能解决问题了...
    可能是被这样的习惯害的吧: 平时写Java应用的时候,如果不确定会出现些什么问题,可能会直接throws Exception,然后跑一下看看会不会出现异常,出现的话就直接会看到stack trace了;而有时候即使确定会出现些什么问题,还是可能会习惯性用e.printStackTrace()来看看stack trace.习惯了这样,而Android的模拟器里只给出那么句错误信息,就不习惯了...然后习惯性的想看看stack trace,就这样 ^ ^
    3 楼 mwjian 2008-03-08  
    呵呵,遇到问题干嘛不debug呢?直接就找到出错的位置。如果不能,模拟器也提供了一个工具来定位出错的代码,DevTools > Exception Browser
    2 楼 seya 2008-03-05  
    那个模拟器效率真是底,慢的不行。
    1 楼 seya 2008-03-05  
    有时候在启动模拟器的情况下,用adb devices命令,显示出的emulator-list却为空。

    相关推荐

      安卓最简单程序 点击与触摸

      极力推荐初学安卓的入门上手程序!很简单,一看就懂。包括点击、触摸、以及快捷键动作的捕捉。希望作为Hellow word 以外你的第一个程序,玩的愉快!

      android opengl 魔方

      基于Android opengles的魔方小游戏。在看见apidemo中自带的魔方例子后就一直想做一个可以触摸旋转的魔方,没事可以玩玩,于是在网上查找了大量的资料,根据自己的理解把魔方例子进行了改良,增加了贴图、触摸扭转、...

      Android代码-TouchEventBus

      &gt; Android 系统的触摸事件分发总是从父布局开始分发,从最顶层的子 View 开始处理,这种特性有时候会限制了我们一些很复杂的交互设计。 &gt; &gt; TouchEventBus 致力于解决非嵌套的滑动冲突,比如多个 在同一层级 的...

      android桌面悬浮宠物框

      这是我自己做的一款在桌面显示的宠物小程序。 运行方式为安装之后双击打开应用。然后活灵活现的小狗就闪亮登场了。 点击小狗提示:我们来玩玩把, 移动小狗提示:别摸我 不关闭该应用的话切换到桌面小狗也会存在。

      多人AndroidTV游戏PieNoon.zip

      Pie Noon 是一个简单的游戏用于演示多个 Nexus 玩家和 Android TV 设备上同时玩的游戏。支持最多 4 个玩家通过蓝牙控制器和触摸设备玩游戏。该游戏使用 FlatBuffers 用于数据序列化,使用 WebP 用于图像压缩和用于...

      Android代码-SmoothRefreshLayout

      支持嵌套滑动,完整实现了NestedScrollingChild2,NestedScrollingParent2 接口,玩转CoordinatorLayout. 直接继承自ViewGroup,拥有卓越的性能,支持类FameLayout的特性(Gravity、Margin). 支持自动刷新、自动上拉加载...

      Android实时投屏软件.此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制 它不需要任何root

      QtScrcpy 可以通过 USB / 网络连接Android设备,并进行显示和控制。无需root权限。 同时支持 GNU/Linux ,Windows 和 MacOS 三大主流桌面平台。 它专注于: 精致 (仅显示设备屏幕) 性能 (30~60fps) 质量 (1920×1080...

      乱跑的小球(Android屏保应用)

      类似于windows7那个球球屏保一样的一个android屏保,但是只有一个小球,不论你在什么应用下,小球都会在屏幕上跑,但是你的触摸响应并不会被小球接收,挺好玩的一个应用,大家玩玩吧

      Android应用中制作选中后图标变大浮动效果的代码分享

      最近在玩3g体育门户客户端的时候,看到这样个效果: 轻触赛事图标,会有一个图标变大浮出的效果.,蛮有意思的.于是就把仿照它做了一个.  这个是原图:  实际上是给图标的触摸事件中添加了一个缩放的动画,代码如下....

      基于Android游戏小暴龙

      在游戏中有暂停功能,开启暂停后可以继续、返回主页面、重玩三大功能。游戏过程中具有白天到黑夜的渐变过程。当小暴龙的生命值为0时,游戏结束,会弹出一个dialog提示你是否记录本次成绩,可以将你的成绩写入数据库...

      Android代码-锁定手机(锁定屏幕,戒手机)

      锁定手机界面,使无法正常操作,让您暂时离开手机,而专注于眼下比玩手机更重要的事。 本应用是作者系统研究安卓的 Window 的阶段性总结 使用须知 本应用通过一点并不复杂的技术实现锁定手机主屏幕,使主屏幕区域...

      NFCSocket:Android Play Near Flyed Communication Socket方式

      但与 Android Beam 不同的是,NfcSocket 允许设备在无需用户干预的情况下自动通信。 NfcSocket 还允许开发人员在 HCE 服务和他们自己的类中处理传入消息。 主要特点 以简单的方式玩 Nfc 通信。 无需用户触摸的多轮...

      触摸控制PinBall弹球游戏

      疯狂android讲义7.2中有个pinball游戏,需要手机支持实体按键控制左右才能玩,看到这里想把游戏改成触摸控制。

      Touch-free-flappy-bird-game:在 AIR 中无需触摸屏幕即可玩飞扬的小鸟游戏

      免触式飞扬的小鸟这是使用 python 语言编写的著名 android 飞扬小鸟应用程序的无触摸克隆。 它可以让您在不使用任何硬件(如键盘、鼠标等)或使用任何触摸动作的情况下移动蓬松的小鸟。 该应用程序是使用图像处理...

      QtScrcpy:Android实时显示控制软件

      启用后,您可以使用键盘和鼠标作为PC版本玩游戏。 或者您可以使用向上/向下/向左/向右方向键来模拟向上/向下/向左/向右滑动。 您还可以根据为其他游戏编写自己的映射文件。 默认的键映射如下: 这是添加新的自定义...

      java源码屏幕刷新-android-breakout:适用于Android设备的突围游戏

      java源码屏幕刷新安卓 突围 v1.0.2 (这以前托管在 上。) 这是经典破砖游戏的 Android 实现。 这主要用作示例代码,提供...该游戏在平板电脑上运行良好,但由于显示屏尺寸较小,在手机上很难玩。 有关代码的一些信息可

      Android手游转电视游戏之模拟操控

      大部分Android手游能够在Android系统的电视终端上运行,其中有少数手游是原生支持手柄(例如MOGA手柄),这部分游戏可以作为电视游戏。但其他手游(射击,赛车,动作等游戏)若要在电视上玩,就需要修改操控模式,把...

      安卓模拟器

      BlueStacks 可以让你在Windows系统下玩各种Android 的APP应用,相比Google 官方提供的Android SDK 开发用的模拟器,BlueStack 对非程序员的普通用户来说显得更加简单易用。如果你没有安卓手机,可以比以前更轻易地...

      QtScrcpy:Android实时显示控制软件

      QtScrcpy QtScrcpy通过USB(或通过TCP / IP)... 启用后,您可以使用键盘和鼠标作为PC版本玩游戏。 或者您可以使用向上/向下/向左/向右方向键来模拟向上/向下/向左/向右滑动。 您还可以根据为其他游戏编写自己的映射

    Global site tag (gtag.js) - Google Analytics