采用BaseLooper框架可以轻松实现Androidjava层的各种设计模式,我们目前实现了AsyncTask,用法如下
{
friend class BaseHandler;
friend class AsyncTaskLooper;
public:
virtual ~AsyncTask() {}
//.在looper环境下调用
//.必须在设定了MainLooper的情况下才能调用
virtual int Execute(bool enablePreExecute= true,bool enablePostExecute=true);
protected:
//在AsyncTask所在looper被调用
virtual void OnPreExecute() {};
//在AsyncTask所在looper被调用
virtual void OnPostExecute() {};
//在AsyncTaskLooper中被调用
virtual void Run() = 0;
//OnPreExecute,OnPostExecute和Run()是串行执行的,不需要做同步处理
};
调用方法
AsyncTask仿照android的AsyncTask,用来在工作线程中执行一段代码
{auto obj = make_shared<WifiScanner>();
obj->Execute();
注意obj不需要AddChild,这样执行完后可自动销毁obj,实现和android下AsyncTask一样的效果
}
WifiScanner代码如下
class WifiScanner :public AsyncTask
{
public:
WifiScanner()
{
mObjectName = "WifiScanner";
}
~WifiScanner()
{
DV("%s", __func__);
}
sigslot::signal1<const CStringEx&> SignalScanAck;
CStringEx mIwpriv;
CStringEx mInterface;
protected:
int system(const char *cmd)
{
DV("%s", cmd);
return ::system(cmd);
}
virtual void OnPreExecute()
{
int x = 0;
}
virtual void OnPostExecute()
{
SignalScanAck(mScanAck);
}
virtual void Run()
{
//启动扫描
system(CStringEx::FormatEx("%s %s set SiteSurvey=1", mIwpriv.c_str(), mInterface.c_str()));
//等待几秒再取结果
ShellTool::Sleep(3 * 1000);
CIwpriv obj;
char ack[4 * 1024] = { 0 };
obj.Execute(ack, sizeof(ack), CStringEx::FormatEx("%s %s get_site_survey", mIwpriv.c_str(), mInterface.c_str()));
mScanAck = ack;
DV("scan ack=%s", mScanAck.c_str());
}
CStringEx mScanAck;
};