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:为照片的文件名称
保存多张照片:用分隔符将文件名连接起来保存 上传:将连接起来的文件名传入Post方法如下
我的服务器是用php写的,这无关紧要,关于分隔符(参见3)其中pathToOurFile为多
个符拼接起来的。
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;
}
,返
再调用系统拍照功能后,怎么设置照片的大小,照片名是
@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