想象一下聊天室风格的活动。它有最新聊天消息的列表视图..每隔5秒我从服务器中提取新消息..
我正在尝试找到在后台定期执行服务器获取的最佳方法。我在onCreate中使用ASyncTask工作得非常好,但后来不得不决定如何继续使用它。
当我从服务器开始下载时,我在屏幕上显示“重新加载”文字,当我完成后我将其清除..
我看了看:
1)让ASyncTask doInBackground()运行一个带有5秒Thread.sleep()和常规publishUpdate的无限while()循环,但这不允许我打开和关闭“Reloading”文本,因为我需要在每个while循环迭代的开始和结束时向UI线程发送消息。
2)接下来我在onCreate方法中使用一个简单的Thread.run(),t.start()和一个while循环,然后使用Handler将消息传递给UI或从UI传递消息以显示/隐藏重新加载文本..这没关系,但现在我的问题是:
如何在onPause和onResume中停止/恢复线程?
我的run()函数中的while()循环使用了一个变量 - while(runThread)并且我在onPause中将runThread设置为false ..但是线程没有得到操作系统的清理..当我来的时候回到onResume,我做t.start(),我抛出一个线程已经在运行的异常......
有关如何使这项工作的任何想法?我错过了更好的方法吗?鉴于我想要一个简单的5秒服务器提取,并且只有在此活动位于前台时才会...
干杯谢谢!
答案 0 :(得分:0)
我会做什么:
创建此类
public class GetInfosTask extends AsyncTask<A , B, C> {
protected C doInBackground(A...) { //this is called in the ui thread
show the text
}
protected void onProgressUpdate(B... progress) {
download
}
protected void onPostExecute(C result) {//this is called in the ui thread
hide the text
}
}
然后使用
初始化该过程mThread = new MyThread(new Runnable() {
public void run() {
pActivity.runOnUiThread(new Runnable() {
new GetInfoTask().execute(arg1, arg2, arg3);
});
wait(5);
});
mThread.start();
暂停/恢复线程时,您可以查看here。 我不会“清理”线程,我会在不需要它时暂停它,然后在需要时重新启动它。
编辑: 纠正了非常愚蠢的错误!谢谢Lalit和yorkw
答案 1 :(得分:0)
你可以调用thread.interrupt()来停止一个线程,一个线程无法恢复,所以每次要重启线程时,都需要创建一个新的线程。
答案 2 :(得分:0)
我会使用重复警报来处理时间而不是管理线程(风险更小/更清洁)。
您需要创建一个BroadcastReceiver来处理警报,然后可以执行AsyncTask或将工作放在IntentService中。
您可以在活动开始时设置闹钟,并记住在闹钟停止时删除闹钟。 onResume()和onPause()。