我正在研究我的学校项目,所以我有一个提供给我的库文件,它扫描卡中的代码并将其返回。问题是它只有在按下按钮时才有效。但是,我希望它始终运行,当我扫描卡时,它会自动返回卡ID而无需按下按钮。
它获得部分卡值,卡ID总共16个字符,但一次需要3-4个字符。所以它就像:
如果没有卡,则返回null。
如何创建在后台运行并无限扫描的asynctask?当代码是16个字符时,它会停止任务并开始一个新活动吗?
编辑:
public class TestService extends IntentService {
public int handle, type = 0x26;
MediaReader md = new MediaReader();
String cardId;
public TestService() {
super("TestService");
// TODO Auto-generated constructor stub
}
@Override
protected void onHandleIntent(Intent intent) {
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
cardId = "";
int ret = md.CardPoll(type);
if (ret == 0) {
for (int i = 0; i < md.uid_len; i++) {
cardId = cardId + md.uid[i];
}
Log.e("MyLogs", cardId);
}
} catch (NullPointerException e) {
Log.e("deneme", "No card detected");
}
}
}
}
答案 0 :(得分:3)
AsyncTask
,尽管受到普遍的看法,但并不打算无限期地运行,实际上不应该这样。 AsyncTask
旨在执行需要一些努力甚至网络操作的简短任务,之后,它们就会结束。
如果你想要无限期地运行一个循环而你想在后台运行它,我建议使用背景Service
。这不会提供Thread
作为AsyncTask
的{{1}}方法,但您可以自己创建一个。
由于它是doInBackground()
,您需要相应地处理它,并在需要时始终使用Service
和startService()
,否则即使您的应用已关闭,它仍可能正在运行当它不需要时(这不是一个好习惯)。