2012-01-01 21 views
7

से भारी गणना लेना मेरा एंड्रॉइड ऐप एक विशेष रूप से बड़ी गणना करता है जो सिस्टम को क्रैश करता रहता है क्योंकि यह गतिविधि में यूआई थ्रेड पर है। मुझे मल्टीथ्रेडिंग में थोड़ा विश्वास नहीं है और इसलिए मैं इसे सही तरीके से करने के तरीके पर कुछ सुझाव प्राप्त करना चाहता हूं। यह है कि मैं क्याएंड्रॉइड यूआई थ्रेड

class ActivtyName extends Activity{ 
boolean threadcomplete = false; 

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
//stuff 

Runnable newthread = new Runnable(){ 

      @Override 
      public void run() { 
       doBigComputation(); 
       threadcomplete=true; 
      } 

     }; 

     newthread.run(); 

     boolean b = true; 
     while(b){ 
      if(threadcomplete){ 
       b=false; 
       startTheApp(); 
      } 
     } 

} 
} 

अब है, मैं बहुत यकीन है कि मैं क्या किया है "सही" नहीं है हूँ। (हालांकि यह काम करने लगता है। सिस्टेम दुर्घटनाग्रस्त नहीं है)। असल में, मुझे यकीन नहीं है कि यूआई थ्रेड को कैसे बताया जा सकता है कि न्यूथ्रेड ने इस बूलियन, थ्रेडम्प्लेट के बिना गणना समाप्त कर दी है। क्या ऐसा करने का कोई "सही" तरीका है?

+0

AsyncTask, http://developer.android.com/reference/android/os/AsyncTask.html –

उत्तर

12

मरेक सेबेरा की टिप्पणी पर थोड़ा सा विस्तार करने के लिए, यहां एक ढांचा है कि आप इसे AsyncTask में कैसे पूरा करेंगे।

private class BigComputationTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
    // Runs on UI thread 
    Log.d(TAG, "About to start..."); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
    // Runs on the background thread 
    doBigComputation(); 
    } 

    @Override 
    protected void onPostExecute(Void res) { 
    // Runs on the UI thread 
    Log.d(TAG, "Big computation finished"); 
    startTheApp(); 
    } 

} 

और यह कॉल करने के लिए:

BigComputationTask t = new BigComputationTask(); 
t.execute(); 
-2

जब मैं धागे का उपयोग करना चाहता हूं, तो मेरे पास लगभग एक बड़ा लूप है। मैंने एक बुलियन स्थिति डाली जो हमेशा सच है, सिवाय इसके कि जब मैं इसे रोकना चाहता हूं।

मैं थ्रेड (http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html) का उपयोग करता हूं और मैं स्टॉप विधि को फिर से कार्यान्वित करता हूं क्योंकि यह बहिष्कृत है। तो मेरी स्टॉप विधि में मैं लूप वैरिएबल को झूठा मान डाल सकता हूं।

थ्रेड को समाप्त करने के लिए, मैं t.stop() का उपयोग करता हूं। तो आप अपनी गतिविधि में ऐसा कर सकते हैं।

यदि आप जानना चाहते हैं कि थैड स्टॉप कब होता है, तो आप t.isAlive() का उपयोग कर सकते हैं। अगर थ्रेड टी शुरू हो गया है, तो ऐलिव सच हो जाएगा।

1

यह धागा शुरू करने का सही तरीका नहीं है। आप क्या करने की जरूरत:

Runnable newthread = new Runnable(){ 

     @Override 
     public void run() { 
      doBigComputation(); 
      threadcomplete=true; 
     } 

    }; 

    Thread t = new Thread(newthread); 
    newthread.start(); 

    boolean b = true; 
    while(b){ 
     if(threadcomplete){ 
      b=false; 
      startTheApp(); 
     } 
    } 
+2

पर एक नज़र रखना का प्रयोग कर एक धागा के लिए प्रतीक्षा करने में शामिल होने, व्यस्त नहीं है इंतजार करो जैसे आप कर रहे हैं। http://docs.oracle.com/javase/tutorial/essential/concurrency/join.html – odiggity

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