Android开发经验积累

时间:2024.4.30

Android开发经验积累

1.java.lang.IllegalStateException: Content has been consumed

这个问题是多次调用httpEntity.getContent()导致的, entity中的内容只能读取一次.

2.java.lang.NullPointerException

at java.net.URLEncoder.encode(URLEncoder.java:92)

代码如下:url="work_img="+ URLEncoder.encode(str7, "UTF-8")

if (str7 == null){ if (messageSubmit7 != null) { str7 = messageSubmit7; } else { str7 =""; } }else { str7=sqliteImagePath; }

要有这句。

3.多个字段的分隔符不要用“|”,尽量别用“&”

“&”在传参数值的时候会用到,避免混淆

“|”:看下面代码:

public static void main(String[] args) { String string="AAA|BBB|CCC"; String[] array=new String[10]; array=string.split("|"); for (String string2 : array) { System.out.println(string2); } 1

}

结果如下:

A

A

A

|

B

B

B

|

C

C

C

public static void main(String[] args) { String string="AAA&BBB&CCC"; String[] array=new String[10]; array=string.split("&"); for (String string2 : array) { System.out.println(string2); } }

结果如下:

AAA

BBB

CCC

4.在页面上有返回按钮时,要用activity.this.finish()来结束掉当前的页面(第二个页面),不要用intent从这个页面跳第一个页面(原页面),因为跳转会让第一个页面onCreate方法在次执行。 例如:在app检测更新的时候,只在第一次进入主页面是检测更新,以后打开其它页面back回来都比检测,如果用intent还会检测。

5.java.util.ConcurrentModificationException

2

这个问题是说,你不能在对一个List进行遍历的时候将其中的元素删除掉

解决办法是,你可以先将要删除的元素用另一个list装起来,等遍历结束再remove掉

可以这样写

List delList = new ArrayList();//用来装需要删除的元素 for(Information ia:list)

if(ia.getId()==k){

n++;

delList.add(ia);

}

list.removeAll(delList);//遍历完成后执行删除

6.回到主页面,finish activity的操作

主页---->SecondActivity ---->ThirdActivity

由于主页面需要检测版本更新,所以需要finish掉除主页外的所有页面。这样就不会在回到主页面的时候再次检测版本更新。(参看4) SecondActivity:SecondActivity.this.finish()

ThirdActivity: ThirdActivity.this.finish()还需要finish SecondActivity

解决方法:

共用的类

3

ExitClass :

public class ExitClass extends Application {

private ArrayList<Activity> aa = new ArrayList<Activity>(); private ArrayList<Service> bb = new ArrayList<Service>();

private static ExitClass exitClass;

public ExitClass() {

}

public static ExitClass getInstance() {

if (exitClass == null) {

exitClass = new ExitClass();

}

return exitClass;

}

public void addActivity(Activity activity) {

aa.add(activity);

}

public void addService(Service service) {

bb.add(service);

}

public void exit() {

for (Activity activity : aa) {

activity.finish();

}

for (Service service : bb) {

service.stopSelf();

}

System.exit(0);

}

public ArrayList<Activity> getAa() {

return aa;

}

}

4

在每个activity中都调用ExitClass.getInstance().addActivity(this);把activity加入到list中

在点击回到主页的事件中:如下代码

ThirdActivity.this.finish(); ArrayList<Activity> arrayList = ExitClass.getInstance().getAa(); for (Activity activity : arrayList) { if (activity instanceof SecondActivity) {

//这里本来我是写arrayList.remove(activity );报错(参见5)

} }

7.拍照,保存多张照片,上传多张照片

拍照:Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");

intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file)); startActivityForResult(intent, 1);

File:为照片的文件名称

Android开发经验积累

保存多张照片:用分隔符将文件名连接起来保存 上传:将连接起来的文件名传入Post方法如下

我的服务器是用php写的,这无关紧要,关于分隔符(参见3)其中pathToOurFile为多

Android开发经验积累

个符拼接起来的。

public String post(String pathToOurFile, String urlServer) throws ClientProtocolException, IOException, JSONException { 5

HttpClient httpclient = new DefaultHttpClient();

// 设置通信协议版本

httpclient.getParams().setParameter(

CoreProtocolPNames.PROTOCOL_VERSION,

HttpVersion.HTTP_1_1);

// String urlServer = "http://192.168.1.88/test/upload.php";

HttpPost httppost = new HttpPost(urlServer);

MultipartEntity mpEntity = new MultipartEntity(); // 文件传输 ContentBody cbFile;

List<File> fileList = new ArrayList<File>();

String[] uploadFiles = new String[10];

uploadFiles = pathToOurFile.split("#");

for (String uploadFile : uploadFiles) {

File file = new File(uploadFile);

fileList.add(file);

}

for (int i = 1; i <= fileList.size(); i++) {

cbFile = new FileBody(fileList.get(i - 1));

mpEntity.addPart("userfile" + i, cbFile);

}

// ContentBody cbFile = new FileBody(file);

对应的和php页面 // mpEntity.addPart("userfile1", cbFile);

// mpEntity.addPart("userfile2", cbFile);

// mpEntity.addPart("userfile3", cbFile);

httppost.setEntity(mpEntity);

System.out.println("executing request " + httppost.getRequestLine());

HttpResponse response = httpclient.execute(httppost);

HttpEntity resEntity = response.getEntity();

System.out.println(response.getStatusLine());// 通信

String json = "";

if (resEntity != null) {

// System.out.println(EntityUtils.toString(resEntity, 不能要这句

json = EntityUtils.toString(resEntity, "utf-8");

6

// 上传多张图片(4张)时

回 success1success2success3success4

Log.e("json=========================998", json);

}

if (resEntity != null) {

resEntity.consumeContent();

}

httpclient.getConnectionManager().shutdown();

return json;

}

,返

再调用系统拍照功能后,怎么设置照片的大小,照片名是

Android开发经验积累

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == 1 && resultCode == RESULT_OK) {

// Bitmap bitmap=(Bitmap) data.getExtras().get("data");

if (file != null && file.exists()) {

paths.add(compressImage(file).getPath());

adapter = new ImageAdapter(UpdateInformationActivity.this,

paths);

galleryFlow.setAdapter(adapter);

galleryFlow.setSelection(paths.size() - 1);

galleryFlow

.setOnItemClickListener(new

GalleryOnItemClickListener());

}

}

}

/**

* 压缩图片(包括质量压缩,大小的缩放)

*/

7

private File compressImage(File file) {

Bitmap bitmap = null;

if (file != null) {

ByteArrayOutputStream baos = new ByteArrayOutputStream(); BitmapFactory.Options option = new BitmapFactory.Options(); option.inJustDecodeBounds = true;

// 获取这个图片的宽和高

bitmap = BitmapFactory.decodeFile(file.getPath(), option); // 此时返回bitmap为空

option.inJustDecodeBounds = false;

// 计算缩放比

int be = (int) (option.outHeight / (float) 320);

if (be <= 0)

be = 1;

option.inSampleSize = be;

bitmap = BitmapFactory.decodeFile(file.getPath(), option); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); int options = 100;

// 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到中

while (baos.toByteArray().length / 1024 > 100) {

// 循环判断如果压缩后图片是否大于100kb,大于继续压缩

baos.reset();// 重置

bitmap.compress(Bitmap.CompressFormat.JPEG, options, baos);

// 这里压缩options%,把压缩后的数据存放到中

options -= 10;// 每次都减少10

}

byte[] b = baos.toByteArray();

return getFileFromBytes(b, file.getPath());

}

return null;

}

/**

* 把字节数组保存为一个文件

*

* @param b

* @param outputFile

* @return

*/

8

public static File getFileFromBytes(byte[] b, String outputFile) { File ret = null; BufferedOutputStream stream = null; try { ret = new File(outputFile); FileOutputStream fstream = new FileOutputStream(ret); stream = new BufferedOutputStream(fstream); stream.write(b); } catch (Exception e) { } e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); } } } return ret;

8.上传服务器,下载等功能必须放在thread中进行

有时会报一些不知名的错误

9.在list列表中,显示图片,错乱的问题

例如:未读的message显示图片为New

已读的message不显示图片 holder.status_image.setBackgroundResource(R.drawable.meikan); status_image.setBackgroundResource(0);

没有图片的不能为holder.status_image.setVisibility(View.INVISIBLE); 否则会出现图片显示错乱的问题

10.设置文字粗体

在xml布局文件中设置android:textStyle="bold"可以将英文字母和 9

阿拉伯数字设置成粗体,对中文不起作用。

将中文设置成粗体的方法是:

submitBtnsubmitBtn);

TextPaint tp = submitBtn .getPaint();

tp.setFakeBoldText(true);

11.当遇到EditText从某地方取来数据,EditText的设置 EditText设置 android:enabled="false"

android:focusable="false"

不要只设置enable,这样还是可以输入的。

12.透明按钮的设置

<Button

android:id="@+id/submitBtn"

android:layout_width="100dp"

android:layout_height="60dp"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:layout_marginBottom="50dp"

android:text="@string/submitBtn_text"

android:textSize="18sp"

android:textStyle="bold"

android:background="@drawable/shape"

/>

Shape.xml:

<?xml version="1.0" encoding="UTF-8"?>

<shape xmlns:android="/apk/res/android" android:shape="rectangle" >

<!-- 填充的颜色 即背景色 #FFF000 为白色 #00000000 为透明 --> <solid android:color="#00000000"/>

<!-- 设置按钮的四个角为弧形 -->

<!-- android:radius 弧形的半径 -->

<corners android:radius="5dip" />

<!-- 边框 -->

<stroke

android:width="5dip"

android:color="#f403c9" />

<!-- padding:Button里面的文字与Button边界的间隔 -->

<padding

10

android:bottom="5dp" android:left="5dp" android:right="5dp" android:top="5dp" /> <!-- 渐变 gradient-->

</shape>

11

更多相关推荐:
Android开发学习感悟

Android开发学习感悟一心态我们每个人都存在着一种心态都想走捷径这就像一种侥幸心理其实学习有没有捷径可以走呢肯定是有的我认为最短的捷径就是不要走弯路这就已经是捷径了前辈们常说欲速则不达这句话存在肯定是有它的...

Android学习心得

Android学习心得这学期我们新开了一门课程android的研发在老师们的介绍下我们了解android的开发环境以及控件的功能刚开始接触Android觉得既陌生又亲切陌生在于没有学过具体的开发软件亲切在于它在...

Android实训心得

Android实训心得刚开始接触Android感觉到它很有意思在界面开发上和web也可以形成了相通的架构更加方便视觉上也是非常的酷在前期我通过的大量的AndroidSDK开发范例大全中的例子以及Android提...

第一次搭Android开发环境的心得

一IDEAndroidSDK及ADT有两种第一种1需要单独的Eclipse作为IDE2安装ADTAndroidDeveloperTools插件ADT在线安装地址3下载AndroidSDK并安装在安装目录下使用S...

android 开发心得

即使你的应用程序是快速且响应灵敏的但一些设计仍然会给用户造成问题与其它应用程序或对话框未事先计划的交互意外的数据丢失意料之外的阻塞等等避免这些问题有助于理解应用程序运行的上下文和系统的交互过程而这些又正影响着你...

Android 嵌入式开发心得体会

Android嵌入式开发心得体会刚开始接触Android感觉到它很有意思在界面开发上和web也可以形成了相通的架构更加方便视觉上也是非常的酷在前期我通过的大量的AndroidSDK开发范例大全中的例子以及And...

Android手写签名开发心得

Android手写签名开发心得这篇文章本来想在一个月前就发布的最近一直忙于国家电网手持终端的应用开发所以没抽出时间来写周末到了终于可以闲下来整理整理话不多说直奔主题Android提供了很多丰富实用而且很有特色的...

android 开发经验文档

Android开发实践总结Sdkv17新建工程Eclipse中新建工程比较简单工具栏filenew然后选择要新建工程的种类比如apk选择AndroidApplicationProject设置应用程序的名称工程名...

应聘Android工程师_2年开发经验

简历123

最新Android技术总结文档(13)

消息机制异步和多线程有了framework后我们不用面对赤裸裸的OSAPI做一些重复而繁杂的事情但天下没有免费的午餐我们还是需要学会高效正确的使用不同的framework很多处理某一特定问题的手法在不同的fra...

Android面试题总结强劲版(一)

自己总结的最强android应用面试题集1activity的生命周期onCreate在activity第一次被创建的时候调用这里是你做所有初始化设置的地方创建视图绑定数据至列表等如果曾经有状态记录参阅后述Sav...

课题:Android源码编译整理总结

Android源码编译整理总结经过好几天的折腾终于在Ubuntu下成功编译源码sdk和adt并成功使用真实费来好大劲即便其中还是有很多不明白的地方下面总结以下自己遇到的问题留到以后查看以及给遇到和我一样问题的人...

android开发心得(34篇)