如何使用setOnTouchListener和Threads?

时间:2016-01-24 04:27:21

标签: java android multithreading

目前,我的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内部使用线程。

1 个答案:

答案 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:

  
      
  1. 的AsyncTask
  2.   

<强> 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.