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