Android:线程间通讯、Handler、Looper、IntentService


public class MainActivity extends Activity implements OnClickListener
{
    private Handler mHandler;
    private TextView textView;
       
    /**
     * 1.继承ItentService类的public myservice()构造方法必须存在 
     * 2.如果已经startservice,再次start的话,会调用onbindservice
     * 3.线程深入封装:HandlerThread和IntentService
     * 4.IntentService:
     *   class MyService extends IntentService
     *   {
     *      public MyService()
     *      {
     *          super("xxx");
     *      }
     *      onHandleMessage()
     *      {
     *          // 在"xxx"线程处理耗时操作
     *      }
     *      onBind()
     *   }      
     */
       
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
           
        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
        findViewById(R.id.button3).setOnClickListener(this);
        textView = (TextView) findViewById(R.id.textView1);
    }
       
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
    @Override
    public void onClick(View v)
    {
        switch (v.getId())
        {
        case R.id.button1:
            btn1Click();
            break;
        case R.id.button2:
            btn2Click();
            break;
        case R.id.button3:
            btn3Click();
            break;
           
        default:
            break;
        }
    }
    private void btn3Click()
    {
        new Thread("子线程2")
        {
            @Override
            public void run()
            {
                Message msg = new Message();
                msg.obj = 30;
                mHandler.sendMessage(msg);
            }
        }.start();
    }
    private void btn2Click()//将main线程消息发送给子线程
    {
           
        Message msg = new Message();
        msg.arg2 = 20;
        mHandler.sendMessage(msg);
    }
    private void btn1Click()//启动自定义消息队列
    {
        try
        {
            Thread.sleep(5000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        new Thread("子线程")
        {
            @Override
            public void run()
            {
                Looper.prepare();//创建Looper和MessageQueue两个对象
                mHandler = new Handler()//由Looper决定哪个线程来执行Handler
                {
                    public void handleMessage(android.os.Message msg)
                    {
                        String threadname = Thread.currentThread().getName();
                        Log.e("handler", "threadname:" + threadname + " msg_1:" + msg.arg1 + " msg_main:" + msg.arg2 + " msg_2:" + msg.obj);//可以接收到消息,自己给自己发送消息
                    };
                };
                   
                Message msg = new Message();
                msg.arg1 = 10;
                mHandler.sendMessage(msg);
                   
//                mHandler.sendEmptyMessage(1);
                   
                Looper.loop();//在该线程中运行消息
            }
        }.start();
    }
       
}




注:

1.结束子线程的方法:设置一个flag标记进行判断

    private void saveCityInfo(final HttpHelperResponse response)
    {
        new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                while (!isThreadOver)
                {
                    Looper.prepare();
                    CityInfoList cityInfo = HBJsonUtils.parseAllCityInfoJson(response.getMsgStr());// 解析
                    // 将下载结果写入缓存
                    mDBHelper.addToCache(cityInfo, mCityId);
                    
                    // 释放
                    recycleCityInfoList(cityInfo);
                    
                    handler.sendEmptyMessage(MSG_SAVE_CITYINFO);
                    Looper.loop();
                }
            }
        }).start();
    }