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");
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章