不知道爲什麼,剛纔寫的安卓下的事件監聽會待審覈,好吧,只是爲了記錄下我的學習狀態而已
接下來說說安卓下的線程安全的問題
安卓的主線程是不允許用戶將耗時的事情放在主線程中進行處理的,因爲這樣容易造成線程的不安全
線程安全:在java中,線程的安全就是指,例如有兩個線程同時在操作同一個ArrayList的時候,我們都
知道,在add方法的時候,分兩步,第一步是增加數據,第二步是增加元素的個數,那麼問題就來了,
如果現在是兩個線程,第一個線程實現了第一步,然後線程暫時停止,而第二個線程獲得CPU的執行權,
那麼添加數據,然後兩個線程同時復活,然後元素只是增加了一個,這樣就會造成數據的丟失的問題。
那麼在安卓中,爲了避免主線程被阻塞,其實在主線程如果出現阻塞的話,會有ANR錯誤,ANR是
如果主線程收到阻塞,那麼程序會蹦出一個窗口,通知用戶,是否將程序關閉這樣的問題。
首先利用handler這一個對象,可以在新開啓的子線程中發送數據給主線程,然後通過handler指揮主線程做
什麼事情,這樣就不會造成線程不安全,比如我們可以傳what,然後再handler.hanldeMessage(Message msg)的方法中
判斷what值,然後執行相應的操作。
異步任務有兩個需要注意,第一個是實現doInBackground方法,第二是onPostExecute,前面的是任務的執行,第二是任務
的返回值的處理。
class MyTask extends AsyncTask<String,Void,String>
{
//異步任務進行
protected String doInBackground(String... args) {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
StringBuilder sb=new StringBuilder();
try {
while((line=br.readLine())!=null){
sb.append(line);
}
return sb.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//獲取返回值進行的操作
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
editText_1.setText(result);
}
}
private class MyClickListener implements OnClickListener
{
public void onClick(View v)
{
new MyTask().execute();
Toast.makeText(MainActivity.this,"按鈕被點擊",Toast.LENGTH_SHORT).show();
}
}