Android小知识点积累

1、httpurlconnection的线程问题

httpurlconnection需要连接网络的权限。Android4.0后连接网络的操作需要在子线程中做,如果放在主线程中执行,会出现android.os.NetworkOnMainThreadException的异常。

2、UI更新问题

更新ui的操作只能在主线程中执行,不能再子线程中更新ui。
那么如何利用子线程中的数据去更新ui呢?答案是利用handler
handler使用步骤如下:
1.在主线程中定义一个Handler对象,并且覆盖对象的handleMessage方法。
2.在子线程中使用该handler对象发送消息到主线程

主线程中做消息处理

private Handler handler = new Handler(){
    public void handleMessage(Message msg)
    {
        String content = (String)msg.obj;
        tv.setText(content);
    }
};

子线程发送消息

//这里使用new的方法拿到Message还不是很好,Message类有一个静态方法obtain()可以拿到一个MessageMessage msg = Message.obtain();
Message msg = new Message();
msg.obj = "abcd";
handler.sendMessage(msg);

3、BitmapFactory使用

BitmapFactory这个类用于将各种资源,包括File,Stream,等转成Bitmap对象。并且这个类中的方法都是静态的,使用非常方便。
in是从网上拿到的图片转换而成的流,转成Bitmap才可以设置到imageView上
Bitmap bp = BitmapFactory.decodeStream(in);

4、利用ByteArrayOutputStream将一个流转换成字符串

很多时候得到inputstream后需要转换成字符串,这是一个常见的操作,利用ByteArrayOutputStream可以做到
假设in是一个inputStream

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while((len=in.read(buffer))!=-1)
{
    baos.write(buffer,0,len);
}
String content = baos.toString();

5、Android应用目录问题

应用的东西存放在data/data/应用包名下。如果要存放自己的文件,可以作为缓存存放,或者作为文件存放。这时目录分别为包目录下的cache目录和file目录。这两个目录的创建可以分别这样拿到:
getCacheDir(),和getFileDir()。然后利用这个路径创建File,关联一个流,就可以做输出了。

String path;
path = getCacheDir();
path = getFileDir();

File的还有另外一种做法:使用getFileOutput直接得到一个输出流。

FileOutputStream fos = getFileOutput("info.txt",0);
fos.write("hehe");

6、使用runOnUIThread更新ui

runonuithread是Activity中的一个方法,底层封装的仍然是发消息的机制去做。使用方法:runonuithread(传一个Runnable)Runnable中的run方法会在主线程中执行

7、Android中实现定时器功能

方法一:使用java中的Timer类,这种方法相当于新开的线程执行,不能直接在TimerTask的run方法中更新ui,如果想要更新ui需要在run方法中执行runonuithread()方法

Timer timer = new Timer();
//Timertask是一个抽象类,继承了Runnable接口。
TimerTask task = new TimerTask(){
    public void run()
    {
        System.out.println("haha");
    }
};
timer.schedule(task,5000);

方法二:使用Handler的postDelayed(Runnable r, long delayMillis)方法.

Handler handler = new Handler();
handler.postDelayed(new Runnable(){
    public void run()
    {
        //在这里可以直接更新ui
        Toast.makeText(getApplicationContext(),"hahaha",0).show();
    }
},5000);

8、文件放到Assets中如何使用

首先放到Assets的文件是不会有资源ID的,并且不会被解析成二进制。
还有一个文件夹下的文件不会被存成二进制,就是res/raw。但这个文件夹下的文件会有资源ID。
那么如何访问Assers下的文件呢?
getAssets()方法会获得一个AssetManager。getAssets()方法可以在Activity的Context下获得,也就是this.getAssets()。也可以用getResources().getAssets()

InputStream in = getAssets().open("news.xml");

你可能感兴趣的:(android学习)