android 报错集锦

		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 

 

你可能感兴趣的:(android)