2016-01-24 61 views
0

目前,我的應用程序的onCreate部分有一個setOnTouchListener。但setOnTouchListener正在做一些繁重的計算和東西,這導致我的應用程序不響應和關閉。如何使用setOnTouchListener和線程?

something.setOnTouchListener(new ImageView.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      /* Heavy stuff*/ 
     } 
    }); 

我看到在Youtube上觀看教程的傢伙說,每當有某種繁重的計算或什麼的,一個不能把在的onCreate否則應用程序將顯示「沒有響應消息」 ,並解決這個問題必須使用線程。

所以,任何人都可以告訴我如何使用setOnTouchListener內部的線程。

+0

的代碼可能是'的onCreate()'但由於這是一個真正的回調,需要用戶「觸摸」它直到那時它纔會執行。通常一個'AsyncTask'可以用來在後臺線程上運行代碼,但不知道你的後臺工作是什麼,我不能說這是最好的方法。 –

+0

http://stackoverflow.com/questions/6887218/thread-while-loop-android應該幫助你 – nullpointer

回答

1

你所尋找的是一個Async Task.

的AsyncTask能夠正確且容易使用的UI線程。該類允許執行後臺操作並在UI線程上發佈結果,而無需操作線程和/或處理程序。

AsyncTask被設計成圍繞線程和處理程序 的助手類,並不構成通用線程框架。 AsyncTasks 理想情況下應該用於短操作(大部分爲 )。如果您需要保持長時間運行線程, 強烈建議您使用java.util提供的各種API。併發包如Executor,ThreadPoolExecutor和FutureTask。

異步任務由運行在 後臺線程上的計算定義,其結果在UI線程上發佈。異步任務由3個通用類型定義,分別稱爲Params, Progress和Result,以及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。幾個異步任務的並行執行

    Android在Android 1.6之前執行AsyncTask任務,並且依次默認爲在Android 1.6之前執行AsyncTask任務。

    您可以告訴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.