线程,Runnable,Handler或ASyncTask? 5秒重复网页刷新

时间:2012-01-07 10:35:45

标签: android multithreading

想象一下聊天室风格的活动。它有最新聊天消息的列表视图..每隔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秒服务器提取,并且只有在此活动位于前台时才会...

干杯谢谢!

3 个答案:

答案 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()。