一、问题
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <SurfaceView android:id="@+id/preview_view" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_centerInParent="true" android:layout_gravity="center" /> <com.zijunlin.Zxing.Demo.view.ViewfinderView android:id="@+id/viewfinder_view" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/transparent" /> <TextView android:id="@+id/txtResult" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="14sp" /> <Button android:id="@+id/magic" android:layout_gravity="right|center_vertical" android:background="@drawable/ic_flash_off" android:layout_width="55dp" android:layout_height="55dp" android:onClick="click" /> </FrameLayout>CaptureActivity.java添加代码如下:
int i = 0; /** * 根据用户的选择,设定闪光灯的状态 * @param v */ public void click(View v) { switch (i % 3) { case 0: CameraManager.get().setFlashOn("torch"); magic.setBackgroundResource(R.drawable.ic_flash_troch); break; case 1: CameraManager.get().setFlashOn("on"); magic.setBackgroundResource(R.drawable.ic_flash_on); break; case 2: CameraManager.get().setFlashOn("off"); magic.setBackgroundResource(R.drawable.ic_flash_off); break; } i++; }CameraManager添加代码如下:
public void setFlashOn(String type){ Camera.Parameters param = camera.getParameters(); param.setFlashMode(type); camera.setParameters(param); }四、效果图 关闭闪光灯状态(默认)
闪光灯常亮状态
这段时日,一直投入时间与精力在找工作。求职目标明确,就是要找到那喜欢而擅长的工作,决定选择互联网或者移动互联网行业,优先考虑深圳这座城市,而至于公司,不管是大公司,还是小公司,个人的成长与发展放在首要位置。
截止到目前,一共参加了4家公司的笔试,2家公司的全程面试,一家是深圳市瑞高信息技术有限公司的Android开发工程师,另一家是百度网络技术有限公司的开发测试工程师,这两家公司的结果还处在等待中。经历这4次笔试,2次面试后,我获得了如下启示。
第一点:笔试很重要,尽最大程度地做好准备。尤其是数据结构与算法设计、C或Java语言、面向对象设计思想这些内容。虽说有时候笔试题目比较基础,但是知识面却很广泛。例如腾讯的笔试题目,就囊括了数据结构、操作系统、软件工程、计算机网络、设计模式、数据库、HTML语言、C语言和C++语言等知识,而这些知识是从事软件开发与应用工作的基石。因而,若是选择做一名软件工程师,这些知识不能不储备、消化、吸收与应用。
第二点:面试的时候,一定要注意回答问题的方式方法。根本目的就是要通过回答面试官的问题以来推销自己,那么 在这个过程中一定要自信、诚恳、谦卑和好学。既要合理表达,又要巧妙聆听,总之,在有限的时间里,把最好的自己展现出来。
第三点:不要轻易放弃,时刻准备着学习和解决问题。机会总是青睐有准备之人,上天也是喜欢自助者。所以,对待每次求职,不管是成功,还是失败,都应该正确地认识与对待,同时,面试过后要进行反思和总结。
第四点:一定要相信自己能够找到那适合的工作,不要慌乱、不要动摇信念。
我想,在求职的过程中,不断地践行和完备上述的四点,一定会有好果子的。
温馨提示:耐心地等候,相信自己。
- 摘要
本文主要分析了libjingle源码中的Thread和SocketServer模块。同时,给出一个使用Thread模块的使用示例。
- 概述
libjingle源码中,Thread和SocketServer模块的原理如下图所示。整个模型实际上是一个消息模型,Thread主要负责处理消息,MessageQue表示的是当前的消息队列,MessageHandler由用户用来定义处理消息的动作。而ThreadManager为单实例,可以获取当前的Thread,这样用户可以往当前的Thread中投递消息。SocketServer代表的是用来侦听Socket的服务,它是一个独立的模块。
消息的处理流程主要由Thread负责。上图中有两条处理流程,分别用两根带箭头的线表示。左边箭头的处理流程为:当消息队列中没有消息时,Thread将控制权转交给SocketServer,直到有消息时会通知SocketServer返回到Thread。也就是说Thread优先的是处理消息,在空闲时,会让SocketServer侦听socket。右边的箭头是正常的消息处理流程,获取消息并处理用户定义的对应的OnMessage函数。
SocketServer模块只是用在libjingle内部,用户并不需要直接使用它。P2P中使用了PhysicalSocketServer作为SocketServer,它的原理如下图所示:
PhysicalSocketServer主要是侦听基于本地网卡的socket(libjingle中还有一些伪socket),然后分发socket事件到Dispatcher中。Dispatcher是PhysicalSocketServer的分发体,功能有点类似于MessageHandler。Dispatcher中定义了感兴趣的socket事件和对应的处理。
类的关系
本文提到的一些类的关系如下图所示。Thread类继承自MessageQue,可以通过Thread类来操作队列消息。PhysicalSocketServer除了实现SocketServer接口之外,还可以添加和删除Dispatcher。熟悉了这些类,基本上就了解Thread模块和SocketServer模块的工作原理。
- 使用
Thread的使用示例参见下面的代码。获取当前线程是通过Thread的Current函数,它会转调ThreadManager对象的CurrentThread函数。由于Thread继承自MessageQue,可以直接通过Thread对象来投递消息,Post函数的第一个参数是OnMessage所处的对象,会被保存于Message对象中。处理消息只要重载MessageHandler的OnMessage函数即可。main函数则调用Thread的Run函数进入默认的消息处理循环,默认的消息处理循环在本示例中就是:循环取消息,调用MessageHandler的OnMessage函数。
#include <string> #include <iostream> #include "talk/base/thread.h" class HelpData : public talk_base::MessageData { public: std::string info_; }; class Police : public talk_base::MessageHandler { public: enum { MSG_HELP, }; void Help(const std::string& info) { HelpData* data = new HelpData; data->info_ = info; talk_base::Thread::Current()->Post(this, MSG_HELP, data); } virtual void OnMessage(talk_base::Message* msg) { switch (msg->message_id) { case MSG_HELP: HelpData* data = (HelpData*)msg->pdata; std::cout << "MSG_HELP : " << data->info_ << std::endl; break; } } }; int main(int argc, char** argv) { Police p; p.Help("Please help me!"); talk_base::Thread::Current()->Run(); return 0; }未完待续...