Android - Runnable run()函数不起作用

时间:2014-01-04 01:50:25

标签: java android multithreading android-asynctask runnable

我正在开发一个扩展活动并实现Runnable的Android应用程序。

问题是run()函数没有启动,我不确定实现Runnable是否让它自动启动为AsyncTask?

这是我的代码

 public class MainActivity extends FragmentActivity implements
        ActionBar.TabListener, Runnable {

        ...

        @Override
        public void run() {
         // mediaPlayer is myMediaPlayer
         // progress is my SeekBar
        Log.w("Tunesto", "testabababab");
         int currentPosition = 0;
         int total = mediaPlayer.getDuration();
         progress.setMax(total);
         while (mediaPlayer != null && currentPosition < total) {
             try {
                 Thread.sleep(1000);
                 currentPosition = mediaPlayer.getCurrentPosition();
             } catch (InterruptedException e) {
                 return;
             } catch (Exception e) {
                 return;
             }
             progress.setProgress(currentPosition);
             Log.w("MyApp", String.valueOf(currentPosition));
         }
        }
 }

显然如果我启动Run fro,UI Thread会因为sleep方法而冻结屏幕,那么我该如何让Run方法运行呢?

谢谢!

2 个答案:

答案 0 :(得分:3)

您必须在Android中使用AsyncTask

执行步骤:

  • 创建一个扩展AsyncTask
  • 的嵌套类
  • 实施您的逻辑所在的doInBackground方法
  • 在您需要致电execute
  • 的嵌套类实例上调用run()方法
  

事实上,我不确定是否可以停止asyntask?

您可以使用cancel()上的AsyncTask方法取消异步任务。有关详细信息,请参阅Android文档。

修改

要将run()函数中的代码移到AsyncTask,您会在UI内放置任何“设置”onPreExecute()内容的内容,例如创建{ {1}}。然后将您的工作放在调用ProgressBar以及sleep() UI Thread内无法完成的其他事情上。如果您需要更新搜索栏,可以通过拨打doInBackground()内的onProgressUpdate()publishProgress()进行更新。最后,如果您需要关闭doInBackground()或做一些结束ProgressBar的内容,您将在UI中执行此操作。

这种解释的原因是onPostExecute()的所有方法都在AsyncTask上运行,但UI Thread除外。

AsyncTask Docs

Vogella: Background tasks in Android

答案 1 :(得分:0)

new Thread(this).start();

虽然处理程序或异步上的匿名内部类比将活动本身设置为Runnable更好。