Eclipse报错如下: FATAL EXCEPTION: main android.app.SuperNotCalledException: Activity {net.reecam/net.reecam.CameraVideo} did not call through to super.onPause() 解决办法:修改Activity生命周期中的Onpause方法,调用基类的onPause()方法。 报错前代码如下: protected void onPause() { } 修改后代码如下: protected void onPause() { super.onPause(); } 小结: 我们对Acitivity的进行管理时,特别是想利用它的生命周期来巧妙进行一些操作时,我们一定要注意, 不要随意删改方法自带的调用基类的super.XX()方法,不然就会跟我一样,费力不讨好,不过还好, listview adapter 报java.lang.NullPointerException;.java.lang.NullPointerException at android.widget.AbsListView.obtainView(AbsListView.java:2035) 莫名的报空指针异常。(前提是已经排除数据问题); 心里那个烦啊,于是就看adapter,看了好几遍,终于在getview中出现错误了。 getview(...){ return null }。 2. namespace和url 中 ip、port请尽量填写WIFI或者公网,因为如果你用手机去模拟上传,你的手机是连接不到内网的(如IP:192.168.1.1或 localhost),连接的域名部分不要用IP地址。 3. 注意Webservice服务器的Soap版本如“version=1.0”,所以客户端指定 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10); 4. String url= "http://134.192.44.105:8080/SSH2/service/IService?wsdl"; Url指的是你的webservice的地址.一般都是以***.wsdl或者***.?wsdl结束的...但是.需要注意的是..要去掉后面的.wsdl或者.?wsdl。(这个一般不会有人犯错吧!)。 5. 可能你用了所有方法也不能解决这个问题,这时你就要注意一下你调用的WevService是不是能够被ksoap2解析了。 6.XML解析时报错: org.xmlpull.v1.XmlPullParserException: PI must not start with xml (position:unknown ???@1:5 in java.io.InputStreamReader@47ec2770) org.xml.sax.SAXParseException: PI must not start with xml (position:unknown xm@3:5 in java.io.InputStreamReader@43e4b480) 是因为XML文件第一行格式错误,仔细修改第一行即可 <?xml version="1.0" encoding="utf-8" ?> 7.Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE . outputandroidcmdInstallation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE Please check logcat output for more details. Launch canceled! android apk多次安装删除,有的时候可能会遇到adb install错误,网上的解决方法我没看懂,我直接在cmd中敲入: adb uninstall 包名,也成功解决了。 对于一些Android开发过程中总有些很坑爹的错误,绕了很大一圈,最后发现是一行代码放错位置,或者少了几句声明等等。 3.在调一些网络通信的程序时,我会在PC端写一个服务端java程序,有时还会用到wireshark这个网络数据包分析软件,这个工具可以清楚地看到网络中实际的数据,很方便 4.在调试多进程、有关SD等方面的程序时,我偶尔会用DDMS来对程序进行监测 以上4点中,我一般用前三种就够了,第4种网上很多人说是什么开发Android必备的,不过我用的很少,可能是我水平还不到家吧 问题汇总: 1、使用UDP来进行网络通信时,由于其receive方法是阻塞的,对于由发送转为接收模式的应用程序,如果发送请求丢包,则该程序会一直阻塞,而不再发送请求,一个实用的方法是UDP套接字的setSoTimeout();方法,可以设定其接收等待时间,以便超时后再次发送请求,保证其可靠性。 2、使用Google的Map-API来进行开发时,<uses-library android:name="com.google.android.maps" />的声明要放在<application></>标签对中,这个是对调用的lib库的声明,不像对授权的声明可以放在<application></>的外面,我就说这里搞错了,然后搞了一天,程序还是打开错误 <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".ParkingWorld" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 声明需要使用Google Map API --> <uses-library android:name="com.google.android.maps" /> </application> 3、使用Google的Map-API来进行开发时,遇到地图MapView组件显示网格,并且有“MapActivity:Couldn't get connection factory client”的error,这可能是由于一下几个原因造成:(类似文章可参考http://our2848884.blog.163.com/blog/static/1468548342011625102639660/) a.Google API Key申请。试着用错误的Google API Key运行程序,地图得到的只是空格。 key的申请可以参考http://choha.iteye.com/blog/1132841 这里为了得到正确的密匙有一点要注意,那就是产生key的方式不同会影响key是否能用,下面的方法我用着可以: 在cmd中执行keytool -list -alias androiddebugkey -keystore “你的debug keystore位置” -storepass android -keypass android b.“INTERNET”使用权限(允许应用程序访问网络)正确添加了如下语句:<uses-permission android:name="android.permission.INTERNET"/> c.使用Google地图的函数库语句正确添加了。 <uses-library android:name="com.google.android.maps"/>,且置于</application>标签前。 4、使用DatagramSocket类创建UDP的套接字,使用Socket、SeverSocket进行TCP的套接字通信时,使用完后要记得调用其close方法,否则端口会被一直占用,导致错误;而且close语句的位置也很重要,我在一个activity中要多次使用套接字来发数据,本想使用一个套接字解决问题,在最后的Stop();或者Destory();方法中将其close,但结果行不通,而我创建一个进程,进程每次执行开始创建一个,进程执行结束时套接字close,这样程序就不会报错,且稳定性也不错,对于那些时常需要刷新数据的应用来说很实用。 5、使用TabHost时,要注意在TabActivity中不能有setContentView(R.layout.main);这样的设置布局的语句,因为TabHost其本身就是用来设置布局的,否则会产生以下错误:Caused by: java.lang.RuntimeException: Your content must have a TabHost whose id attribute is 'android.R.id.tabhost' 6、当你在A工程中调试X.java时,如果你同时在eclipse中有另一个B工程中也有同名文件X.java,则在双击打印出来的错误信息时,eclipse可能会帮你定位到B工程的X.java中,让你看了半天也没找到哪里有错误,这时你可以先把B工程从eclipse删去,再重新双击打印出来的错误信息,eclipse就会帮你正确定位啦。 7、java中的乘方运算用Math.pow(底数, 指数);方法,而不使用"^"符号,"^"在java中表示异或。 8、在使用TextView的setText方法时,注意其重载性,若要要将int整型作为参数时,编译器认为你的参数是个资源ID,找不到对应的ID时,会出现类似以下的报错:android.content.res.Resources$NotFoundException: String resource ID #0xfe 而如果你是要显示这个int型数据,我通常会用 “”+数据 的方法利用“+"符号的重载性,将int数据直接转为String类型。当然,也可以用Integer.valueOf(int i).toString将其转为String类型。 9、使用套接字传数据使用以下方法时,虽然String类型中是用char型来存储数据的,但在使用getBytes()方法后,有的数据,比如char型0x0001会变为一个字节的byte型0x01,而不是两个字节0x00和0x01,但很多时候其还是会变为两个字节,比如中文编码。这可以用wireshark抓包来看,当然也可以直接调用类的length()方法,再打印查看。 1 byte dataSend[] = str.getBytes(); //把传输内容分解成字节*/3 //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个、地址,以及端口号 4 DatagramPacket packetSend = new DatagramPacket(dataSend,dataSend.length,serverAddress,dstPort); 5 //调用socket对象的send方法,发送数据 6 socket.send(packetSend);因此在用一个字节表达数据时,为防止String转byte[]时的不确定性,我就直接用byte[]赋给dataSend[],也可以使用String的getBytes(String charsetName)方法 Returns a new byte array containing the characters of this string encoded using the named charset. byte by[] = new byte[4]; by[0] = ledNum; by[1] = (byte)(Integer.parseInt(strR1)); by[2] = (byte)(Integer.parseInt(strG1)); by[3] = (byte)(Integer.parseInt(strB1)); byte dataSend[] = by; //创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个、地址,以及端口号 DatagramPacket packetSend = new DatagramPacket(dataSend,dataSend.length,serverAddress,dstPort); //调用socket对象的send方法,发送数据 socket.send(packetSend); 10、在使用TabHost时应注意其Activity的生命周期,如果不加 Intent.FLAG_ACTIVITY_CLEAR_TOP 这个flag,则Tab之间切换时,Activity只是0nPause();而不执行onStop();和onDestroy(); 并且在设置 addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 之后,切换到另一个Activity会调用另一个Activity的OnCreat方法 tabHost.addTab(tabHost.newTabSpec("tab2").setIndicator(getString(R.string.park), getResources().getDrawable(android.R.drawable.star_on)) .setContent(new Intent(this, ParkActivity.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))); //这句用来清空之前所有的activity 11、从XML文件中获取字符串的方法 getString(R.string.my_str); 12、在 handlerSocket.post(update); 之后又在update中递归调用 handlerSocket.postDelayed(this, 2000); 则可能会导致跳转到另一个Activity时,update仍会一次又一次地执行,这时可以在跳出Activity的触发函数,如onPause,onStop函数中加入 handlerSocket.removeCallbacks(update); 如果还是不行的话可以使用全局开关变量,runFlag(自己取的名字)。在跳入Activity的触发函数,如onCreat,onResume函数中runFlag=1,而在跳出Activity的触发函数runFlag=0。并且使用runFlag来控制 handlerSocket.postDelayed(this, 2000); 如下列代码 @Override protected void onCreate(Bundle savedInstanceState) { ...... runFlag = 1; ...... ...... update =new Runnable(){ @Override public void run() { ...... if(runFlag == 1){ handlerSocket.postDelayed(this, 2000); } } handlerSocket.post(update); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); //handlerSocket.removeCallbacks(update); runFlag = 0; } 1、android.content.pm.PackageManager$NameNotFoundException 这个是因为安装的应用程序,不完整,apk有问题导致。 下载的时候出异常的话写一个接口。有一个回调。 出错了,怎么处理。 从arraylist删除 2、 java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2131493171, class android.widget.ListView) with Adapter 这个问题出现在onresume的时候使用AsyncTask,点击item到下一个界面,按back返回的时候,出现bug。 这个修改的时候加个判断当adpter不为空时notifyDataSetChanged,为空的时候就重新new. 3、 添加文件到Sdcard出现Failed to push selection: Invalid argument问题 用DDMS添加文件到内存卡里提示 Failed to push the item(s). 解决方案: 把内存卡的容量加大,重启eclipse就OK了。 补充:如果提示Failed to push selection: Invalid argument, 说明你的路径中包括中文,请把中文全改为英文。导入的时候不要有空格 ,或者直接将APK拖到 File Explorer的sdcard里面。 4、java.lang.ArithmeticException: divide by zero: 算数异常 http://www.eoeandroid.com/thread-84037-1-1.html http://topic.csdn.net/t/20040409/23/2947339.html 5、java.lang.IllegalStateException: get field slot from row 0 col 0 failed当数据库查询结果大于1M的时候,会报这个错误。 解决办法:查询的时候限制结果列,不要查出所有的列,只查询自己需要的。 Java代码 1.String abcname = "abc"; 2. 3.Cursor c = db.query("table", new String[]{age, agender,heighth}, "name"+"=?", new String[]{abcname}, null, null, null); String abcname = "abc"; Cursor c = db.query("table", new String[]{age, agender,heighth}, "name"+"=?", new String[]{abcname}, null, null, null); 6、android sqlite查询数据时报错: get field slot from row 0 col -1 failed , int id = cursor.getInt(cursor.getColumnIndex(ID)); , 此处是获取ID的值, 查看上面代码后发现查询字段中没有查询ID字段, 而现在又要获取这个字段的值,所以报了这个错误 获得查询有限制的时候,缺少列导致。 7、java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. 解决办法:list变了,立马就得notifyDataSetChanged。 类似于clear()之后就马上notifyDataSetChanged。 8、 ListView/Adapter IllegalStateException java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. 相信有不少android初学者在运用ListView和Adapter时发生了上述的异常。一般情况下,上述异常一般发生在我们启动一个后台线程加载数据,同时在主线程(即UI线程)刷新ListView在显示新加载的内容。我们的做法一般是:在后台线程中把加载的数据放入到一个List中,而在主线程中实例化Adapter,这个Adapter中所用到的List正是在后台线程中加载的那个List。 发生上述异常的代码思路是这样子的,请看代码: 首先,我们定义一个List全局变量,后台线程中加载的数据就放到这个list中(请注意我标了红色的list变量,问题就出在它身上): private List<Map<String,Object>> list = null; 接着,我们会启动一个后台线程,用于加载数据: class GetDataThread implements Runnable{//单独启动一个线程用于加载歌曲列表 @Override public void run() { list = new ArrayList<Map<String,Object>>(); //然后把搜索出来的数据放入到list中。 } } 最后,我们会在主线程中刷新界面,刷新界面的代码,我们是要放到handler中处理的: class RefreshLocalMusicListThread implements Runnable{ @Override public void run() { local_lv = (ListView)findViewById(R.id.local_musiclist); SimpleAdapter adapter = new SimpleAdapter(LocalActivity.this,list,R.layout.local_music_list,new String[] {"local_name","local_size"}, new int[]{R.id.local_name,R.id.local_size}); local_lv.setAdapter(adapter); LocalActivity.this.registerForContextMenu(local_lv); handler.postDelayed(refreshThread, 10); } } 以上的思路,是会发生上述异常的!下面请看我的分析: 当执行 SimpleAdapter adapter = new SimpleAdapter(LocalActivity.this,list,R.layout.local_music_list,new String[] {"local_name","local_size"}, new int[]{R.id.local_name,R.id.local_size});时集合list中数据与我们的listView是绑定在一起的了。此时,,假如list中的数据有5条,即list.size()==5,这时与listView绑定的就是5条数据。但是,我们的后台线程还在运行,list中的数据会发生变化,然而我们的listView认定的就是之前只有5条数据的list,但是这时的list中的数据已经不是5条了,就是这个冲突导致了上述的异常!!! 正确的解决方法是这样的: 既然与listView绑定了的list发生了变化而没来得及通知listView导致了上述的异常,那我们就针对这一点,只要listView与list绑定后,在listView显示之前不要让list发现变化就行了。做法有很多种,我个人的做法是这样子的: 首先,定义一个独立的List: private List<Map<String,Object>> data = null; 接着,在onCreate或者onResume中初始化它(当然,你也可以在每次用到它的时候初始化它,不过这样子会初始化很多歌对象,浪费内存,不推荐): data = new ArrayList<Map<String,Object>>(); 然后,在创建adapter之前,把list中数据放入到集合data中,注意千万不要直接赋值:data = list(这是错误的,因为这样data也指向了list所在的内存地址,即data跟list是同一个对象,list改变的话data也跟着改变);应该这么做: data.clear();//要先清空data中的数据,避免把list中的数据重复放入data中。 data.addAll(list);//这样做,list中的数据就放入到data中,之后list在后台线程中改变,但data不会改变,这时,你再 SimpleAdapter adapter = new SimpleAdapter(LocalActivity.this,data,R.layout.local_music_list,new String[] {"local_name","local_size"}, new int[]{R.id.local_name,R.id.local_size}); listView与data绑定,就不会发生上述异常了! 注意::在新开的线程里面执行的代码,一旦报错是很难查找的,因为中途异常就不会再执行线程下面的代码了,也 不会堵塞ui线程,所以必须通过大量打印去反馈信息! 9. listview 控件 写android:layout_height="wrap_content" 发现数据更新后,视图怎么也没更新的问题, android:layout_height="fill_parent"就好了.有疑问?android开发,有时候,视图布局问题可能引发 很多未知的错误,而且这种错误是不报错的,很难发现!同样要注意相对布局中嵌套线性布局的属性写法。 10. static 方法 方法在该方法所属类型第一次被使用的时候加载、在该类型所在应用程序域卸载的时候卸载、也就是说 static 方法只加载一次、除非整个Domain 被卸载了。而实例方法(非静态方法),是在第一次该方法第一次调用的时候会加载、然后被缓存起来。但是中间如果有GC 的话, 就会被收集,那下次再调用该方法时,又得重新加载该方法。也就是说,实例方法有可能加载多次。总的来说,static 方法只用加载一次,但一直会占用内存。多了些资源消耗;而实例方法需要加载多次,但不会一直占用内存。少些资源消耗。一般来说, 在程序里面,一些使用频率高的方法就用static 方法、使用频率低的则用实例方法。 但是我每次调用的时候都会产生在listItem.measure(0,0)报空指针异常。我debug 发现listItem 并不是为空啊,为啥会报错。在经过一番查找之后。我发现原来是自己item的布局用了RelativeLayout 把他换为LinearLayout 就好了。究其原因,原来是 Linearlayout重写了onmeasure方法,其他的布局文件没有重写onmeasure,所以在调用listItem.measure(0, 0); 会报空指针异常,如果想用这个东东,就必须用linearlayout布局喽。 11.报这个错,xml又没提示信息,一般为包名pack有问题,看是否规范 Unable to instantiate activity