(说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改。)

在Qt中并没有特定的串口控制类,如今大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类。我们能够去

http://sourceforge.net/projects/qextserialport/files/

进行下载,也能够去下载我上传到网上的:

http://download.csdn.net/source/1762781  或 http://www.qtcn.org/bbs/read.php?tid=22847

下载到的文件为:qextserialport-1.2win-alpha.zip

其内容例如以下图:

我们在windows下仅仅须要使用当中的6个文件:

qextserialbase.cpp和qextserialbase.h,qextserialport.cpp和qextserialport.h,win_qextserialport.cpp和win_qextserialport.h

假设在Linux下仅仅需将win_qextserialport.cpp和win_qextserialport.h 换为 posix_qextserialport.cpp和posix_qextserialport.h就可以。

第一部分:

以下我们将讲述编程的具体过程,这里我们先给出完整的程序,然后到第二部分再进行逐句分析。

1.打开Qt Creator,新建Qt4 Gui Application,project名设置为mycom,其它使用默认选项。

(注意:建立的project路径不能有中文。)

2.将上面所说的6个文件拷贝到project目录下,例如以下图。

3.在project中加入这6个文件。

在Qt Creator中左側的文件列表上,鼠标右击project目录,在弹出的菜单中选择Add Existing Files,加入已存在的文件。例如以下图:

选择project目录里的那6个文件,进行加入。例如以下图。

加入好后文件列表例如以下图所看到的:

4.点击mainwindow.ui,在窗体上增加一个Text Browser,用来显示信息。例如以下图。

5.在mainwindow.h的对应位置加入头文件#include "win_qextserialport.h",加入对象声明Win_QextSerialPort *myCom;加入槽函数声明 void readMyCom();加入完后,例如以下图。

6.在mainwindow.cpp的类的构造函数中加入例如以下语句。

MainWindow::MainWindow(QWidget *parent)

: QMainWindow(parent), ui(new Ui::MainWindow)

{

ui->setupUi(this);

struct PortSettings myComSetting = {BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};

//定义一个结构体,用来存放串口各个參数

myCom = new Win_QextSerialPort("com1",myComSetting,QextSerialBase::EventDriven);

//定义串口对象,并传递參数,在构造函数里对其进行初始化

myCom ->open(QIODevice::ReadWrite);

//以可读写方式打开串口

connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));

//信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作

}

在以下加入readMyCom()函数的定义,加入例如以下代码。

void MainWindow::readMyCom() //读串口函数

{

QByteArray temp = myCom->readAll();

//读取串口缓冲区的全部数据给暂时变量temp

ui->textBrowser->insertPlainText(temp);

//将串口的数据显示在窗体的文本浏览器中

}

加入完代码后例如以下图。

此时假设执行程序,已经能实现读取串口数据的功能了。我们将单片机採集的温度信息由串口传给计算机,效果例如以下图。

这样最简单的串口通信程序就完毕了。能够看到它仅仅须要增加几行代码就可以,很easy。


第二部分:

上一部分中已经介绍了实现最简单的串口接收程序的编写,以下将对程序内容进行分析。

1.首先应说明操作串口的流程。

步骤一:设置串口參数,如:波特率,数据位,奇偶校验,停止位,数据流控制等。

步骤二:选择串口,如windows下的串口1为“com1”,Linux下为“ttyS0”等,并打开串口。

步骤三:读或写串口。

步骤四:关闭串口。

(我们上一个程序没有写串口和关闭串口的功能,打开串口也是在构造函数里完毕的,由于那仅仅是为了用最简单的方法完毕串口程序的编写。在后面我们将会对它进行改动和完好。)

2.以下我们将依照上面的操作串口的流程,解说第一个程序的编写。

第一,我们在敲代码之前,应该浏览一下那6个文件,大概看一下它们里面都是什么内容,各个文件各个类之间有什么联系。在win_qextserialport.cpp文件里,我们看它的最后一个构造函数,会发现,串口能够在这里进行初始化。


Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings, QextSerialBase::QueryMode mode) {

Win_Handle=INVALID_HANDLE_VALUE;

setPortName(name);

setBaudRate(settings.BaudRate);

setDataBits(settings.DataBits);

setStopBits(settings.StopBits);

setParity(settings.Parity);

setFlowControl(settings.FlowControl);

setTimeout(settings.Timeout_Millisec);

setQueryMode(mode);

init();

}

它共同拥有三个參数,当中第一个參数const QString & name,应该是串口的名字,是QString类型,我们能够用串口1即“com1”,不用过多说明。以下我们主要研究第二个和第三个參数。

第二,我们查看第二个參数的位置。

在Qt Creator的菜单中选择Edit->Find/Replace->All projects,例如以下图。

在弹出的对话框中输入要查找的内容PortSettings,例如以下图。

点击Search后,便能在以下显示出整个project中全部PortSettings的位置。例如以下图。

我们点击第一条,能够看到在qextserialbase.h文件里有一个struct PortSettings,例如以下图。

我们双击这一条,进入对应的文件。例如以下图。

struct PortSettings

{

BaudRateType BaudRate;

DataBitsType DataBits;

ParityType Parity;

StopBitsType StopBits;

FlowType FlowControl;

long Timeout_Millisec;

};

能够看到在这个结构体里定义了串口初始化的各个參数,而对于BaudRateType等类型的定义,我们在这个结构体的上面能够看到,它们是多个枚举变量。例如以下图。

这时我们便应该明确了,这个结构体便是实现串口參数设置的。

第三,定义串口參数。

BaudRateType BaudRate;

波特率设置,我们设置为9600,即程序中用BAUD9600;

DataBitsType DataBits;

数据位设置,我们设置为8位数据位,即DATA_8;

ParityType Parity;

奇偶校验设置,我们设置为无校验,即PAR_NONE;

StopBitsType StopBits;

停止位设置,我们设置为1位停止位,即STOP_1;

FlowType FlowControl;

数据流控制设置,我们设置为无数据流控制,即FLOW_OFF;

long Timeout_Millisec;

延时设置,我们设置为延时500ms,即500;

这样便写出了程序中的那句:

struct PortSettings myComSetting = {BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};

我们定义了一个结构体变量myComSetting,并对其进行了初始化。

第四,设置第三个參数。

我们先按上面的方法找到它的定义位置,在qextserialbase.h中,例如以下图。

能够看到查询模式也是枚举变量,有两个选项,我们选择第二个EventDriven,事件驱动。

到这里,我们就能够定义Win_QextSerialPort类的变量了,就是那句:

myCom = new Win_QextSerialPort("com1",myComSetting,QextSerialBase::EventDriven);

它完毕了串口的选择和串口的初始化。

第五,写打开串口函数和读串口函数。

查看win_qextserialport.h文件,我们会发现Win_QextSerialPort类继承自QextSerialBase类。

查看qextserialbase.h文件,我们会发现QextSerialBase类继承自QIODevice 类。

我们在Qt的帮助中查看QIODevice 类,例如以下图。

其部分内容例如以下图。能够看到当中有enum OpenModeFlag { NotOpen, ReadOnly, WriteOnly, ReadWrite, ..., Unbuffered },virtual bool open ( OpenMode mode ),QByteArray readAll ()等内容。

而以下的信号函数中有void readyRead ();它能够查看串口是否有新的数据传来。

所以,我们能够用这个类里的这些函数操作串口。

如程序中的语句:

myCom ->open(QIODevice::ReadWrite);

//我们调用了当中的open函数,用ReadWrite可读写的方式进行打开串口,这个open函数在win_qextserialport.cpp中被重定义了

connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));

//我们关联信号readyRead(),和自己写的槽函数readMyCom(),当串口有数据传来时进行读串口操作

void MainWindow::readMyCom() //自己写的读串口函数

{

QByteArray temp = myCom->readAll();

//我们调用readAll()函数,读取串口中全部数据,在上面能够看到其返回值是QByteArray类型

ui->textBrowser->insertPlainText(temp);

//调用insertPlainText()函数,是窗体上的文本浏览器中连续输出数据,而不是每次写数据前都清除曾经的

//数据,能够在Qt的帮助里查看这个函数的说明

}

这样我们便写完了全部的语句,最后仅仅须要在mainwindow.h文件里增加对应的头文件,对象声明,函数声明就可以。

这里须要说明的是我们一定要学会查看文件和使用帮助文档,将我们不懂得知识一点一点搞明确。

第三部分:

以下的程序在第一部分中所写的程序上进行了一些改进。增加打开和关闭串口,发送数据等功能。

1.增加了“打开串口”,“关闭串口”“传送数据”三个button,增加了一个行编辑框Line Edit。它们的命名例如以下:

“打开串口”button命名为:openMyComBtn

“关闭串口”button命名为:closeMyComBtn

“传送数据”button命名为:sendMsgBtn

要传送数据的行编辑框命名为:sendMsgLineEdit

界面例如以下图。

2.在“打开串口”button上右击,选择Go to slot选项,然后选择clicked()选项,进入它的单击事件槽函数中,将上个程序中在构造函数里写的语句所有剪切到这里。然后增加几句button的状态设置语句。例如以下:

void MainWindow::on_openMyComBtn_clicked()

{

struct PortSettings myComSetting = {BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};

//定义一个结构体,用来存放串口各个參数

myCom = new Win_QextSerialPort("com1",myComSetting,QextSerialBase::EventDriven);

//定义串口对象,并传递參数,在构造函数里对其进行初始化

myCom ->open(QIODevice::ReadWrite);

//以可读写方式打开串口

connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));

//信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作

ui->openMyComBtn->setEnabled(false); //打开串口后“打开串口”button不可用

ui->closeMyComBtn->setEnabled(true); //打开串口后“关闭串口”button可用

ui->sendMsgBtn->setEnabled(true); //打开串口后“发送数据”button可用

}

在构造函数里也加入几句button初始状态设置语句,例如以下:

MainWindow::MainWindow(QWidget *parent)

: QMainWindow(parent), ui(new Ui::MainWindow)

{

ui->setupUi(this);

ui->closeMyComBtn->setEnabled(false); //開始“关闭串口”button不可用

ui->sendMsgBtn->setEnabled(false); //開始“发送数据”button不可用

}

更改后程序例如以下图所看到的:

这时执行程序,效果例如以下:

3.按上面的方法进入“关闭串口”button和“发送数据”button的单击事件的槽函数,更改例如以下。

void MainWindow::on_closeMyComBtn_clicked()      //关闭串口槽函数

{

myCom->close(); //关闭串口,该函数在win_qextserialport.cpp文件里定义

ui->openMyComBtn->setEnabled(true); //关闭串口后“打开串口”button可用

ui->closeMyComBtn->setEnabled(false); //关闭串口后“关闭串口”button不可用

ui->sendMsgBtn->setEnabled(false); //关闭串口后“发送数据”button不可用

}

/***********************************/

void MainWindow::on_sendMsgBtn_clicked()       //发送数据槽函数

{

myCom->write(ui->sendMsgLineEdit->text().toAscii());

//以ASCII码形式将行编辑框中的数据写入串口

}

程序例如以下图:

终于效果例如以下:

(将数据x发送给单片机,单片机返回you send message is : x)

第四部分:

本文一開始先解说对程序的改进,在文章最后将要解说一些重要问题

1.在窗体中增加一些组合框Combo Box,它们的名称及条目例如以下:

串口:portNameComboBox,条目为:COM1,COM2

波特率:baudRateComboBox,条目为:9600,115200

数据位:dataBitsComboBox,条目为:8,7

校验位:parityComboBox,条目为:无,奇,偶

停止位:stopBitsComboBox,条目为:1,2

(注:在窗体上的Combo Box上双击,在弹出的对话框上按“+”号,可加入条目。我们仅仅是为了演示,所以仅仅加了这几个条目,你能够依据自己的须要加入。)

改好的窗体例如以下所看到的:

2.更改“打开串口”button的单击事件槽函数。

void MainWindow::on_openMyComBtn_clicked()

{

QString portName = ui->portNameComboBox->currentText(); //获取串口名

myCom = new Win_QextSerialPort(portName,QextSerialBase::EventDriven);

//定义串口对象,并传递參数,在构造函数里对其进行初始化

myCom ->open(QIODevice::ReadWrite); //打开串口

if(ui->baudRateComboBox->currentText()==tr("9600")) //依据组合框内容对串口进行设置

myCom->setBaudRate(BAUD9600);

else if(ui->baudRateComboBox->currentText()==tr("115200"))

myCom->setBaudRate(BAUD115200);

//设置波特率

if(ui->dataBitsComboBox->currentText()==tr("8"))

myCom->setDataBits(DATA_8);

else if(ui->dataBitsComboBox->currentText()==tr("7"))

myCom->setDataBits(DATA_7);

//设置数据位

if(ui->parityComboBox->currentText()==tr("无"))

myCom->setParity(PAR_NONE);

else if(ui->parityComboBox->currentText()==tr("奇"))

myCom->setParity(PAR_ODD);

else if(ui->parityComboBox->currentText()==tr("偶"))

myCom->setParity(PAR_EVEN);

//设置奇偶校验

if(ui->stopBitsComboBox->currentText()==tr("1"))

myCom->setStopBits(STOP_1);

else if(ui->stopBitsComboBox->currentText()==tr("2"))

myCom->setStopBits(STOP_2);

//设置停止位

myCom->setFlowControl(FLOW_OFF); //设置数据流控制,我们使用无数据流控制的默认设置

myCom->setTimeout(500); //设置延时

connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));

//信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作

ui->openMyComBtn->setEnabled(false); //打开串口后“打开串口”button不可用

ui->closeMyComBtn->setEnabled(true); //打开串口后“关闭串口”button可用

ui->sendMsgBtn->setEnabled(true); //打开串口后“发送数据”button可用

ui->baudRateComboBox->setEnabled(false); //设置各个组合框不可用

ui->dataBitsComboBox->setEnabled(false);

ui->parityComboBox->setEnabled(false);

ui->stopBitsComboBox->setEnabled(false);

ui->portNameComboBox->setEnabled(false);

}

这里我们先获取串口的名称,然后调用还有一个构造函数对myCom进行定义,这个构造函数里没有串口的设置參数。然后打开串口。然后获取串口的设置数据,用setBaudRate();等一系列函数进行串口的设置,这些函数都在win_qextserialport.cpp文件里定义,例如以下图。

看完前面几部分的内容,对于这几个函数应该非常好理解,这里不再解释。在最后我们对加入的那几个组合框进行了不可用设置,使其在串口打开的情况下不能选择。

程序例如以下:

3.更改“关闭串口”button单击事件的槽函数。

void MainWindow::on_closeMyComBtn_clicked()

{

myCom->close();

ui->openMyComBtn->setEnabled(true); //关闭串口后“打开串口”button可用

ui->closeMyComBtn->setEnabled(false); //关闭串口后“关闭串口”button不可用

ui->sendMsgBtn->setEnabled(false); //关闭串口后“发送数据”button不可用

ui->baudRateComboBox->setEnabled(true); //设置各个组合框可用

ui->dataBitsComboBox->setEnabled(true);

ui->parityComboBox->setEnabled(true);

ui->stopBitsComboBox->setEnabled(true);

ui->portNameComboBox->setEnabled(true);

}

这里仅仅是增加了一些使组合框在“关闭串口”button按下后变为可用的语句。

程序例如以下:

4.更改main.cpp文件。

#include

#include //增加头文件

#include "mainwindow.h"

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

QTextCodec::setCodecForTr(QTextCodec::codecForLocale());

//使程序可处理中文

MainWindow w;

w.show();

return a.exec();

}

由于上面的程序中用到了中文,为了能使程序识别中文,我们须要在主函数中增加这些语句。

程序例如以下:

5.执行程序。

打开后程序界面例如以下。

正常发送1后效果例如以下。

设置为“奇校验”,发送完1的效果例如以下图。(接收到的是乱码)

到这里,整个程序就写完了。

重要问题说明:

(以下所说的第一个程序是指第一部分中写的那个程序,第二个程序是指第三部分更改完后的程序,第三个程序是指第四部分更改完后的程序。)

问题一:更改第一个程序中的代码。

struct PortSettings myComSetting = {BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};

myCom = new Win_QextSerialPort("com1",myComSetting,QextSerialBase::EventDriven);

这两行代码假设换为以下一行:

myCom = new Win_QextSerialPort("com1",QextSerialBase::EventDriven);

你再执行一下程序,是不是还能用?那是说明我们的串口设置的结构体myComSetting没实用吗?你能够把上面的结构体里的波特率由9600改为115200,假设这个结构体实用,那么程序不可能再接收到数据,只是,你再执行一下程序,是这样吗?

如此看来,我们对串口进行的设置果真没用,那默认的串口设置是什么呢?我们先看下一个问题。

问题二:同一时候打开第三个程序和第二个程序。

(注意:两个程序的串口不能同一时候打开,所以打开一个程序的串口时要将还有一个程序的串口关闭。)

我们先在第三个程序上按默认设置打开串口,发送数据1。然后关闭串口,在第二个程序上打开串口,发送数据1。能够看到两个程序上接受到的信息都正确。例如以下图。

我们关闭第二个程序上的串口,再将第三个程序上设置为奇校验,然后打开串口,发送数据1,能够看到其收到的数据显示乱码。这时我们关闭第三个程序上的串口,打开第二个程序上的串口,发送数据1,你会惊奇地发现,它收到的信息也是乱码。例如以下图。

这究竟是怎么回事呢?我们也能够去网上下载其它的串口助手进行实验,也能够改变波特率进行实验。由全部的结果得出的结论仅仅能是:我们用那个结构体作为參数传过去后,并没有对串口进行设置,而程序执行使用的串口设置是系统曾经保留的设置。那么,为什么会这样呢?我们看以下的一个问题。

问题三:更改第三个程序中的代码。

myCom ->open(QIODevice::ReadWrite);

放到设置串口的语句之后,

connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));

这句之前,然后再执行程序。你会发现程序的串口设置功能已经不起作用了。如今知道原因了吧?!

事实上,上面的三个问题是一个问题,它的结论是,写串口程序时,要先打开串口再对它进行设置,不然设置就不会起作用。所以,这里应该说明,第一个和第二个程序都是不太正确的,正确的方法应该是像第三个程序一样,先定义Win_QextSerialPort类对象,然后打开串口,再用那几个设置函数对串口进行设置。

到这里,整篇文章就结束了。对于当中的一些问题也仅仅是我个人的观点,因为水平有限,所以理解上可能会有偏差,或者错误,还请广大网友批评指正。我写这篇文章的目的仅仅是想让Qt刚開始学习的人能更轻松的用Qt写出串口通信程序,及掌握Qt敲代码时的一些技巧。假设你从我的文章中学到了一个知识点,那么我的这篇文章就有它的意义了。

最后,假设你喜欢我的写作风格,而且初学Qt,能够在我的空间查看Qt Creator系列教程,希望能对你的入门有所帮助。

到这里能够下载本文的PDF文档:http://download.csdn.net/source/1763251

Qt编写串口通信程序全程图文解说的更多相关文章

  1. 转:Qt编写串口通信程序全程图文讲解

    转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Q ...

  2. Qt编写串口通信程序全程图文讲解 .

    在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qex ...

  3. 【转】Qt编写串口通信程序全程图文讲解

    本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自 ...

  4. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

  5. Qt实现串口通信总结

    Qt实现串口通信总结 注意: Qt5发布之前,Qt实现串口通信一般是采用第三方类库qextserialport.Qt5发布后自带了QtSerialPort 能够支持串口通信. 1.Qextserial ...

  6. C语言PIC16 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新PIC16 Boot ...

  7. C#--简单的串口通信程序

    前几天做毕业设计,其中要用到串口和下位机进行通信,于是自己捣鼓了一个简单的串口通信程序. 在做通信之前要先弄一个SerialPort组件出来,当然也可以通过程序来创建.本次设计中采用的是拖的winfo ...

  8. 创建C#串口通信程序详解

    在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports.这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信.我们将使用标准 ...

  9. C#串口通信程序详解

    C#串口通信程序详解 摘要:创建C#串口通信程序需要注意什么呢?创建C#串口通信程序的步骤是什么?那么本文就向你详细介绍创建C#串口通信程序集体的内容. 在.NET平台下创建C#串口通信程序,.NET ...

随机推荐

  1. LightOj_1364 Expected Cards

    题目链接 题意: 一副牌, 每个花色13张牌,加上大小王,共54张. 遇到大小王可以代替其中某种花色. 给定C, D, H, S. 每次抽一张牌, 问抽到C张梅花, D张方块, H张红桃, S张黑桃所 ...

  2. 如何使用Github仓库创建网站

    官方文档:https://help.github.com/categories/github-pages-basics/ 1.创建一个仓库 2.额外建立一个gh-pages分支 3.添加CNAME文件 ...

  3. UOJ179 线性规划

    Description 这是一道模板题. 本题中你需要求解一个标准型线性规划: 有\(n\)个实数变量\(x_1,x_2,\cdots,x_n\)和\(m\)条约束,其中第\(i\)条约束形如\(\s ...

  4. [转贴]一个将表格变成 INSERT 的SQL 语句的存储过程(sql server)

    来源自http://vyaskn.tripod.com/code.htm#inserts SET NOCOUNT ON GO PRINT 'Using Master database' USE mas ...

  5. 值得推荐的C/C++框架和库 very good

    [本文系外部转贴,原文地址:http://coolshell.info/c/c++/2014/12/13/c-open-project.htm]留作存档 下次造轮子前先看看现有的轮子吧 值得学习的C语 ...

  6. 17.2.2.1 The Slave Relay Log Slave中继日志

    17.2.2.1 The Slave Relay Log Slave中继日志 中继日志, 像binary log,有一组文件组成包含events 描述数据库的修改,和一个index文件包含所有使用过的 ...

  7. Learning WCF Chapter2 Messaging Protocols

    In Chapter 1,you were introduced to fundamental WCF concepts,      在章节1中,学习了wcf中的基础概念including how t ...

  8. bzoj1458

    题做多的话不难想到可能是以行列作为二分图两个点集,然后网络流相关 具体怎么弄呢 我们可以用求补集的思想,假设有解 我们先把棋盘能放的地方放满士兵,然后我们尽量的把士兵拿走 并且要满足行和列的要求, 说 ...

  9. 【转】ios中@class和 #import 的使用时机

    代码中会发现有部分#import操作写在m文件中,而h文件仅仅使用@class进行声明,为什么不直接把#import放到h文件中呢? 这是因为h文件在修改后,所有import该h文件的所有文件必须重 ...

  10. Android Loader详解三:重启与回调

    重启装载器 当你使用initLoader()时,如果指定ID的装载器已经存在,则它使用这个装载器.如果不存在呢,它将创建一个新的.但是有时你却是想丢弃旧的然后开始新的数据. 要想丢弃旧数据,你应使用r ...