我正在开发一个android应用程序,扩展活动并实现Runnable。
问题是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线程会因为sleep方法而冻结屏幕,那么我应该如何让Run方法运行呢?
谢谢!
您必须在Android中使用AsyncTask
。
执行步骤:
- 创建一个扩展
AsyncTask
的嵌套类 - 实现
doInBackground
方法,您的逻辑应该驻留在该方法中 - 在需要调用
run()
的嵌套类实例上调用execute
方法
事实是,我不确定是否有可能停止asyntask?
您可以在AsyncTask
上使用cancel()
方法取消异步任务。有关此方面的更多详细信息,请参阅Android文档。
编辑
要将run()
函数中的代码移动到AsyncTask
,您将在onPreExecute()
中放入任何"设置"UI
的内容,例如创建ProgressBar
。然后把你的工作放进去,比如调用sleep()
和其他在doInBackground()
中的UI Thread
上无法完成的事情。如果您需要更新搜索栏,可以在onProgressUpdate()
中通过在doInBackground()
中调用publishProgress()
来完成。最后,如果你需要取消ProgressBar
或做一些结束UI
的事情,你会在onPostExecute()
中这样做。
之所以进行这种解释,是因为除了doInBackground()
之外,AsyncTask
的所有方法都在UI Thread
上运行。
异步任务文档
Vogella:Android 中的后台任务
new Thread(this).start();
尽管处理程序或异步上的匿名内部类比使活动本身可运行要好。