目前,我的app的onCreate部分有一个setOnTouchListener。但是setOnTouchListener正在进行一些繁重的计算以及导致我的应用无法响应和关闭的东西。
something.setOnTouchListener(new ImageView.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
/* Heavy stuff*/
}
});
我在Youtube上看到了一个教程,那个人说,每当有某种繁重的计算或其他事情时,都不能把它放在onCreate中,否则应用程序会显示" Not Responding消息& #34;,要解决这个问题,必须使用Threads。
任何人都可以告诉我如何在setOnTouchListener内部使用线程。
答案 0 :(得分:1)
您要找的是Async Task.
AsyncTask可以正确,轻松地使用UI线程。此类允许在UI上执行后台操作和发布结果 线程,而不必操纵线程和/或处理程序。
AsyncTask旨在成为Thread和Handler的辅助类 并不构成通用的线程框架。 AsyncTasks 理想情况下应该用于短期操作(几秒钟的时间) 大多数。)如果你需要保持线程长时间运行, 强烈建议您使用提供的各种API java.util.concurrent包,如Executor,ThreadPoolExecutor和 FutureTask。
异步任务由在a上运行的计算定义 后台线程,其结果发布在UI线程上。一个 异步任务由3种泛型类型定义,称为Params, 进度和结果,以及4个步骤,称为onPreExecute,doInBackground, onProgressUpdate和onPostExecute。
传统上,您基本上是异步执行任务,因此它不会挂起UI。这就是您所遇到的结果:“这导致我的应用无法响应并关闭。”
取自Vogella:
- 的AsyncTask
醇>
<强> 7.1。 AsyncTask类的用途
AsyncTask类封装了后台进程的创建以及与主线程的同步。它还支持报告正在运行的任务的进度。
<强> 7.2。使用AsyncTask类
要使用AsyncTask,您必须将其子类化。 AsyncTask使用泛型和变量。参数是以下AsyncTask。
AsyncTask通过execute()方法启动。
execute()方法调用doInBackground()和onPostExecute()方法。
TypeOfVarArgParams作为输入传递给doInBackground()方法,ProgressValue用于进度信息,ResultValue必须从doInBackground()方法返回,并作为参数传递给onPostExecute()。
doInBackground()方法包含应在后台线程中执行的编码指令。此方法在单独的线程中自动运行。
onPostExecute()方法再次与用户界面线程同步,并允许更新它。一旦doInBackground()方法完成,框架就会调用此方法。
<强> 7.3。并行执行几个AsyncTasks
Android在Android 1.6之前执行AsyncTask任务,默认情况下依次从Android 3.0开始执行。
你可以告诉Android使用executeOnExecutor()方法并行运行它,指定AsyncTask.THREAD_POOL_EXECUTOR作为第一个参数。
以下代码段演示了这一点。
// ImageLoader extends AsyncTask
ImageLoader imageLoader = new ImageLoader(imageView);
// Execute in parallel
imageLoader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "http://url.com/image.png");
<强> 7.4。使用AsyncTasks的缺点
AsyncTask不会自动处理配置更改,即如果重新创建活动,程序员必须在编码时处理它。
一个常见的解决方案是在保留的无头片段中声明AsyncTask。
请查看此内容,以获得良好的概述以及如何实现它的示例:Handlers, Async Tasks and Threads - Vogella.