Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 異步、消息、通知、菜單 的介紹

異步、消息、通知、菜單 的介紹

編輯:關於Android編程

異步任務—AsyncTask

為什麼要異步任務

Android單線程模型 耗時操作放在非主線程中執行

AsyncTask為何而生

子線程中更新UI 封裝、簡化異步操作

如何使用AsyncTask-異步任務

AsyncTask

構建AsyncTask子類的回調方法

doInBackground:必須重寫,異步執行後台線程將要完成的任務。 doPreExecute:執行後台耗時操作被調用,通常用於完成一些初始化操作。 onPostExecute:當doInBackgroup()完成後,系統會自動地調用onPostExecute()方法,並將doInBackgroup()方法返回的值傳給該方法。 onProgressUpdate:在doInBackgroup()方法中調用publishProgress() 方法更新任務的執行進度之後,就會觸發該方法。

異步加載網絡圖片

class MyAsyncTask extends AsyncTask{

        //執行後台任務之前
        @Override
        protected void onPreExecute()
        {
            super.onPreExecute();
            progresssBar.setVisibility(View.VISIBLE);
        }

        //執行後台任務之後,在這裡設置UI,更新數據
        @Override
        protected void onPostExecute(Bitmap result)
        {
            super.onPostExecute(result);
            progressBar.setVisibility(View.GONE);
            mImageView.setImageBitmap(bitmap);
        }

        //在後台執行的任務(耗時操作,網絡加載數據)
        @Override
        protected Bitmap doInBackground(String... params)
        {
            String url=params[0];
            Bitmap bitmap=null;
            URLConnection conn;
            InputStream is;
            try
            {
                conn=new URL(url).openConnection();
                is=conn.getInputStream();
                BufferedInputStream bis=new BufferedInputStream(is);
                bitmap=BitmapFactory.decodeStream(bis);
                is.close();bis.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

            return bitmap;
        }
}

在主活動中使用異步加載:

MyAsyncTask task=new MyAsyncTask();

task.execute(URL);//傳進去一個參數url

Handler的原理

一. Handler封裝了消息的發送和消息的處理。

Looper

內部包含一個消息隊列也就是MessageQueue,所有的Handler發送消息都走向這個消息隊列。 Looper.Looper方法,就是一個死循環,不斷地從MessageQueue中取消息,如有有消息就處理消息,沒有消息就阻塞,直到有消息傳來。

二、MessageQueue,就是一個消息隊列,可以添加消息,並處理消息。

三、Handler也很簡單,內部會跟Looper進行關聯,也就是說在Handler的內部可以找到Looper,找到了Looper也就找到了MessageQueue,在Handler中發送消息,其實就是向MessageQueue隊列中發送消息,存儲消息。

總結:handler負責發送消息,Looper負責接收Handler發送的消息,並直接把消息回傳給handler自己,handler然後在處理消息。MessageQueue就是一個存儲消息的容器。

DeBug模式

添加斷點 程序運行到斷點位置會自動停止到斷點代碼處 開始追蹤程序
F6 逐行追蹤
F5 進入方法
F7 跳出方法
F8 下一個斷點或是結束DeBug模式

Toast常用方法

Toast.makeText(context,text,duration);//返回值為Toast toast.setDuration(duratin);//設置持續時間 toast.setGravity(gravity,xOffset,yOffset);//設置toast位置,xOffset、yOffset是偏移量。 toast.setText(ts);//設置提示內容 toast.show();//顯示,不調用就不會顯示

顯示自定義位置的Toast

private void showToast(){
    Toast toast=Toast.makeText(this,"改變位置的Toast",Toast.LENGTH);
    toast.setGravity(Gravity.CENTER,0,0);//相對中間偏移量為0,
    toast.show();

}

顯示帶圖片的Toast

private void showToast(){
    Toast toast=Toast.makeText(this,"顯示帶圖片的Toast",Toast.LENGTH_LONG);
    LinearLayout toastLayout=(LinearLayout) toast.getView();
    ImageView img=new ImageView(this);
    img.setImageResource(R.drawable.ic_launcher);
    toastLayout.addView(img,0);
    toast.show();

}

完全自定義的Toast

  
    
        
            
            
        
    

使用:

public void showToast(){
    View view1=View.inflate(this, R.layout.item, null);
    Toast toast=new Toast(this);
    toast.setView(view1);
    toast.show();
}

發送通知欄信息

private void sendNotification(){
    int id=100;//用於區分多個通知時
     NotificationManager manager=(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    Intent intent=new Intent(this,MainActivity.class);
    PendingIntent pintent=PendingIntent.getActivity(this, 0, intent, 0);
    Builder builder=new Notification.Builder(this);
    builder.setSmallIcon(R.drawable.ic_launcher);

    builder.setTicker("hello");//手機狀態欄的提示
    builder.setWhen(System.currentTimeMillis());//設置時間
    builder.setContentTitle("通知欄通知");//設置標題
    builder.setContentText("wo來自廣藥火星");//設置通知欄通知內容
    builder.setContentIntent(pintent);//設置點擊後的意圖
//      
//      builder.setDefaults(Notification.DEFAULT_SOUND);
//      builder.setDefaults(Notification.DEFAULT_LIGHTS);
//      builder.setDefaults(Notification.DEFAULT_VIBRATE);
//      
        builder.setDefaults(Notification.DEFAULT_ALL);//包括上面三種
    Notification notification=builder.build();//4.1以上才生效

    manager.notify(id, notification);
    //取消指定id的通知
    //manager.cancel(id);

}

選項菜單

創建選項菜單:onCreateOptionsMenu();

設置菜單項可用代碼動態設置menuAdd();

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
//getMenuInflater().inflate(R.menu.main, menu);
menu.add(1, 100, 1, “賦值”);
menu.add(1, 101, 1, “刪除”);
menu.add(1, 102, 1, “粘貼”);
menu.add(1, 103, 1, “設置”);
return true;
}

還可以通過xml設置MenuInflaterinfalte()
    @Override
public boolean onCreateOptionsMenu(Menu menu)
{
    getMenuInflater().inflate(R.menu.main, menu);

    return true;
}
設置菜單項點擊事件:onOptionsItemSelected()

第一種方法點擊事件

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item)
{
    switch(item.getItemId()){
        case R.id.action_settings:
            Toast.makeText(this, "你點擊了設置", 0).show();
            break;
    }
    return true;
}

第二種方法點擊事件

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item)
{
    switch(item.getItemId()){
        case 100:
            Toast.makeText(this, "你點擊了賦值", 0);
            break;
        case 101:
            Toast.makeText(this, "你點擊了刪除", 0);
            break;
        case 102:
            Toast.makeText(this, "你點擊了粘貼", 0);
            break;
        case 103:
            Toast.makeText(this, "你點擊了設置", 0);
            break;
    }
return true;
}

菜單跳轉到另一頁面:

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item)
{

    switch(item.getItemId()){
        case R.id.settings:
            Toast.makeText(this, "跳轉頁面", 0).show();
            Intent intent=new Intent(this,SecondActivity.class);
            item.setIntent(intent);
            startActivity(intent);
            break;
    }


    return true;
}

ContextMenu的組成

標題以及標題圖標 菜單內容 菜單內容的點擊事件

ContextMenu與OPtionMenu的區別

OptionMenu對應的是activity,一個activity只能擁有一個選項菜單 ContextMenu對應的是View,每個View都可以設置上下文菜單; 一般情況下,ContextMenu常用於ListView或者Gridview

ContextMenu的創建方法

首先給View注冊上下文菜單 registerForContextMenu()
this.registerForContextMenu(listView);
添加上下文菜單內容onCreateContextMenu();

-可以通過代碼動態添加

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle("文件操作");
    menu.setHeaderIcon(R.drawable.ic_launcher);
    menu.add(1, 103, 1, "設置");
    menu.add(1, 102, 1, "粘貼");
    menu.add(1, 100, 1, "賦值");
    menu.add(1, 101, 1, "刪除");
}

-可以加載xml文件的菜單項

設置菜單點擊後的響應事件onContextItemSelect();

子菜單:代碼方式動態添加子菜單

改變樣式為無標題模式,可以使子菜單懸浮於屏幕上

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
//加載xml文件添加
//  getMenuInflater().inflate(R.menu.main, menu);

//動態添加
    SubMenu file=menu.addSubMenu("文件");
    SubMenu edit=menu.addSubMenu("編輯");
    file.add(1, 100, 1, "新建");
    file.add(1, 101, 1, "打開");
    file.add(1, 102, 1, "保存");

    file.setHeaderTitle("文件操作");
    file.setHeaderIcon(R.drawable.ic_launcher);

    edit.add(1, 100, 1, "復制");
    edit.add(1, 101, 1, "刪除");
    edit.add(1, 102, 1, "粘貼");
    edit.add(1, 103, 1, "設置");
    return true;
}

點擊事件實現:

    @Override
public boolean onMenuItemSelected(int featureId, MenuItem item)
{
    if(item.getGroupId()==1){
        switch(item.getItemId()){
            case 100:
                Toast.makeText(this, "新建", 0).show();
                break;
            case 101:
                Toast.makeText(this, "打開", 0).show();
                break;
            case 102:
                Toast.makeText(this, "保存", 0).show();
                break;
        }
    }else if(item.getGroupId()==2){
        switch(item.getItemId()){
            case 100:
                Toast.makeText(this, "復制", 0).show();
                break;
            case 101:
                Toast.makeText(this, "刪除", 0).show();
                break;
            case 102:
                Toast.makeText(this, "粘貼", 0).show();
                break;
        }
    }
    return true;
}
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved