2012-08-28 18 views
28

निष्पादित करना मैं एंड्रॉइड एसडीके 4.0.3 एपीआई 15 का उपयोग कर रहा हूं और मैं समान रूप से एकाधिक AsyncTasks को चलाने के लिए चाहता हूं। मुझे अपना डेटा वेब सर्वर और एनिमेटिंग (10 एफपीएस) से वास्तविक समय मिल रहा है। लेकिन उपयोगकर्ता संचालन के आधार पर मुझे कुछ डेटा वेब सर्वर पर भी भेजने की जरूरत है। जब ऐसा होता है तो मेरी एनीमेशन थोड़ी देर के लिए रुक जाती है (डेटा भेजना कतार में आता है और डेटा प्राप्त करने के लिए यह इंतजार कर रहा है) और इसलिए मैं वास्तविक समय नहीं पकड़ सकता।एकाधिक AsyncTask के समानांतर

यह answer काफी समझा रहा है लेकिन मैं इसे काम नहीं कर सका। तो किसी भी मदद की सराहना की जाएगी।

मुझे लगता है कि मुझे लगता है कि प्राप्त करने के लिए इस सुविधा का उपयोग करने की आवश्यकता है:

AsyncTask.executeOnExecutor(Executor exec, Params... params) 

लेकिन मैं एक पैरामीटर के रूप में एक निष्पादक पारित नहीं हो सकता और मैं एक प्रबंधक का दृष्टांत नहीं कर सकते। यह मेरा AsyncTask वर्ग है:

public class GetPlayers extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... urls) { 

     Thread.currentThread().setPriority(Thread.MAX_PRIORITY); 

     rawData=""; 
     for (String url : urls) { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(new InputStreamReader(content)); 
       if((rawData = buffer.readLine()) == null){ 
        rawData = "error"; 
       } 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
     return rawData; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     manipulate(); 
    } 
} 

और मैं इसे इस तरह निष्पादित करें:

GetPlayers task = new GetPlayers(); 
requestString = "web adress is here..."; 
task.execute(new String[] { requestString }); 
+0

क्या आप एक निष्पादक को पैरामीटर के रूप में पास नहीं करते हैं और मैं निष्पादक को तत्काल नहीं कर सकता। ' क्या आपने डेवलपर.android.com/reference/java/util/concurrent/Executor.html, http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html की जांच की है? आप किस सटीक निष्पादक का उपयोग करने की कोशिश कर रहे हैं? – sandrstar

+0

वास्तव में मुझे निष्पादकों पर अधिक अनुभव नहीं है। तो मैंने निष्पादक वर्ग को तुरंत चालू करने की कोशिश की। जहां तक ​​मैं लिंक से समझ गया हूं, मुझे थ्रेडपूलएक्सएटर का उपयोग करने की आवश्यकता है। मैं इसके लिए खोज करूंगा। धन्यवाद। – Srht

+0

दाएं, निष्पादक सिर्फ एक इंटरफेस है और इसे तुरंत नहीं किया जा सकता है। आप प्रस्तुत निष्पादकों के लिए निष्पादक दस्तावेज़ों के 'ज्ञात अप्रत्यक्ष सबक्लास' अनुभाग देख सकते हैं। हालांकि, ठेठ एक ThreadPoolExecutor प्रतीत होता है। – sandrstar

उत्तर

55

यह वह जगह है मैं कैसे करना है कि:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
} else { 
    new MyAsyncTask().execute(); 
} 

जहां MyAsyncTask नियमित AsyncTask उपवर्ग है। या फिर आप सभी सहायक कक्षा में इस लपेट कर सकते हैं:

class TaskHelper { 

    public static <P, T extends AsyncTask<P, ?, ?>> void execute(T task) { 
     execute(task, (P[]) null); 
    } 

    @SuppressLint("NewApi") 
    public static <P, T extends AsyncTask<P, ?, ?>> void execute(T task, P... params) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
      task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); 
     } else { 
      task.execute(params); 
     } 
    } 
} 

और फिर बस कार्य करें:

TaskHelper.execute(new MyTask()); 

या

TaskHelper.execute(new MyTask(), args); 

या

TaskHelper.execute(new MyTask(constructorParams), args); 
+0

मैं इस पर अपना तर्क कैसे दे सकता हूं। इस कदर? नया MyAsyncTask()। executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR, नया स्ट्रिंग [] {requestString}); – Srht

+0

कृपया हमेशा एसडीके दस्तावेज के साथ शुरू करें। सही नहीं है, फिर भी यह उपयोगी है .. 'executeOnExecutor()' पर: http://developer.android.com/reference/android/os/AsyncTask.html#executeOnExecutor%28java.util.concurrent.Executor,%20 पैराम। ..% 2 9 ताकि आप अपने पैरामीटर –

+0

पास कर सकें मैंने प्रश्न पूछने से पहले देखा और पढ़ा है, लेकिन मुझे नहीं पता था कि इसका उपयोग कैसे किया जाए। मैंने अपनी कक्षा परिभाषा के लिए 'executeOnExecutor (निष्पादक निष्पादन, पैराम्स ... पैरा) 'जोड़ने की कोशिश की और जहां तक ​​आप अनुमान लगा सकते हैं कि यह काम नहीं करता है। मैं एक नौसिखिया हूं लेकिन खुद को चीजें करने की कोशिश कर रहा हूं। इस मामले में मैं बस इसका उचित उपयोग नहीं जानता (और नहीं मिला): 'नया MyAsyncTask()। ExecuteOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR);' इसलिए इस जानकारी के लिए बहुत बहुत धन्यवाद जो चमत्कार की तरह काम करता है। और कृपया निराश न हों :) – Srht

0

यह समस्या मेरे लिए हुई , AndroidStudio में अपना ऐप अपडेट करते समय एंड्रॉइड 2.3 का उपयोग कर इंटेलिया से एसडीके 25 तक बस थोड़ा बदलाव (executeOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR, string1, ...);) अच्छी तरह से काम। मेरे पास डाउनलोड के लिए एक सेवा में चल रहा एक AsyncTask है और कोई सेवा में अपलोड करने के लिए AsyncTasks बनाएँ।

संबंधित मुद्दे