2012-12-06 19 views
18

हाय मैं Toast मुझे उपलब्ध नहीं करना चाहता हूं, जब भी मैं अपने आवेदन में पसंद करता हूं, किसी भी थ्रेड से क्या और उपलब्ध नहीं है। तो यह करने के लिए मैं Activity वर्ग बढ़ाया:एंड्रॉइड - वर्कर थ्रेड से यूई थ्रेड को कॉल करना

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.widget.Toast; 

public class MyActivity extends Activity{ 
    private Handler mHandler; 

    @Override 
    public void onCreate(Bundle savedInstanceState) {  
     mHandler = new Handler(); 
     super.onCreate(savedInstanceState); 
    } 

    private class ToastRunnable implements Runnable { 
     String mText; 

     public ToastRunnable(String text) { 
      mText = text; 
     } 

     public void run(){ 
      Toast.makeText(getApplicationContext(), mText, Toast.LENGTH_SHORT).show(); 
     } 
    } 

    public void doToast(String msg) { 
     mHandler.post(new ToastRunnable(msg)); 
    } 
} 

ताकि सभीActivity मेरे एप्लिकेशन में कक्षाएं अब कर रहे हैं बस

public class AppMain extends MyActivity { 
    //blah 
} 

क्या मैं (करने के लिए सक्षम होने के लिए एक कार्यकर्ता सूत्र में उम्मीद

try{ 
    MyActivity me = (MyActivity) Looper.getMainLooper().getThread(); 
    me.doToast("Hello World"); 
} 
catch (Exception ex){ 
    Log.e("oh dear", ex.getMessage()); 
} 

और इतने लंबे समय के रूप में Activity एक "MyActivity" यह काम करना चाहिए था:) यह था - लेकिन समस्या यह है --->Looper.getMainLooper().getThread();MyActivity मेरे पास वापस नहीं लौटा रहा है और यह मुझे रो रहा है - मैं क्या गलत कर रहा हूं?

: संपादित करें:

कुछ पृष्ठभूमि समझाने के लिए "क्यों" मैं implmentation के इस प्रकार के साथ फंस कर रहा हूँ।

मुझे उपयोगकर्ता को यह पुष्टि करने में सक्षम होना चाहिए कि "HTTP पोस्ट" ईवेंट सफल रहा है। अभी व। यदि यूआई यूआई फॉर्म पर "ओके" पर क्लिक करता है तो यह उस समय इंटरनेट नहीं हो सकता है या नहीं .. अगर इसमें इंटरनेट है - सब ठीक है और अच्छा है - यह HTTP POST के माध्यम से फॉर्म को अच्छी तरह से और अच्छी के माध्यम से पोस्ट करता है .. लेकिन अगर वहाँ कोई इंटरनेट सबसे अधिक (99.999 एंड्रॉयड का% एप्लिकेशन लंगड़ा/दयनीय/इस पर mewling, और मूल रूप से उपयोगकर्ता की पेशकश नहीं योजना "बी" यह सोचते हैं कि हर समय इंटरनेट नहीं है - जब यह नहीं है)

मेरा ऐप "लंगड़ा (जैसा कि मैं इसे कॉल करता हूं)" नहीं होगा - इसमें योजना "बी" है, इसके बजाय यह पोस्ट इवेंट "क्यूईज़" करती है और प्रत्येक एक्स मिनट को पुनः प्रयास करती है .. अब यह एक मूक धागा है पृष्ठभूमि .. मेरे पास पूरे ऐप पर बहुत सारे उपयोगकर्ता इंटरैक्शन हैं, मुझे नहीं पता कि उपयोगकर्ता कहां है "होगा" लेकिन आखिरकार जब HTTP पोस्ट कतार/retries/queue/retries देता है "! सफलता! "मुझे लगता है कि उपयोगकर्ता के लिए संदेश के रूप में Toast करना चाहते हैं (जैसे:" अपने प्रपत्र भेजा गया था ")

उत्तर

50

क्या runOnUiThread

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable) कोड नीचे

activity.runOnUiThread(new Runnable() { 
    public void run() { 
     Toast.makeText(activity, "Hello, world!", Toast.LENGTH_SHORT).show(); 
    } 
}); 
+0

नहीं, मैं 'उपयोगकर्ता,' runOnUiThread' एक 'Runnable Action' स्वीकार करता है जो' Toast' – conners

+0

साथ काम नहीं करता कोई 'activity' है पर पोस्ट करने के Toast' संदेशों चाहते कोई' संदर्भ है, क्योंकि ' – conners

+1

' getAplicationContext() 'का उपयोग क्यों न करें? – Rawkode

6

उपयोग के साथ गलत क्या है गतिविधि बनाने?। वस्तु जो अपनी गतिविधि उदाहरण में शामिल है ..

activity.runOnUiThread(new Runnable() { 
    public void run() { 
    Toast.makeText(activity.getApplicationContext(),"Toast text",Toast.LENGTH_SHORT).show(); 
    } 
); 
+0

में उपलब्ध नहीं है, मैं 'कार्यकर्ता 'थ्रेड में हूं, वहां कोई' गतिविधि' नहीं है (यह एक के रूप में योग्य नहीं है पैरामीटर क्योंकि कार्यकर्ता हमेशा संदेश भेजने के लिए सर्वर से कनेक्ट करने का प्रयास कर रहा है .. और उसके बाद गतिविधि कॉल बंद हो जाती है .. मुझे सर्वर से पुष्टि करने की आवश्यकता है और जैसे ही यह होता है, उपयोगकर्ता को ईवेंट को स्वीकार करने की आवश्यकता है। वर्तमान यूई थ्रेड को गतिविधि के रूप में खांसी के लिए एंड्रॉइड की आवश्यकता है। – conners

+0

यदि आप कार्यकर्ता धागे के लिए गतिविधि संदर्भ पास करने में असमर्थ हैं, तो यह स्पष्ट है कि आपकी थ्रू विज्ञापन डिजाइन समस्या की जड़ है। धागे को बनाते समय संदर्भ को पारित करने में सक्षम होना चाहिए, बजाय धागे को भौतिक रूप से लागू करना। – LoungeKatt

2

तुम बस एक instanc को getThread() का परिणाम डाली नहीं कर सकता आपके MyActivity बेस क्लास का ई। getThread() एक Thread देता है जिसका Activity से कोई लेना देना नहीं है।

कोई शानदार पढ़ना नहीं है: आप जो करना चाहते हैं उसे साफ करने का तरीका। किसी बिंदु पर, आपके "वर्कर थ्रेड" अमूर्तता के लिए कुछ ऐसा संदर्भ होना चाहिए जो आपके लिए Toast बना सकता है। Toast शॉर्टकट शॉर्टकट करने में सक्षम होने के लिए बस Activity सबक्लास के संदर्भ में कुछ स्थैतिक चर को सहेजना, स्मृति मेमोरी लीक और दर्द के लिए एक नुस्खा है।

+0

मैं एक स्थिर वर्ग का उपयोग नहीं कर रहा हूं, यह 'हैंडलर' शामिल करने के लिए 'गतिविधि' के लिए एक मूल विस्तार है .. मैं चाहता हूं कि एंड्रॉइड करना वर्तमान गतिविधि खांसी है .. – conners

+1

@conners: यह इस तथ्य को नहीं बदलेगा कि' getThread() '' थ्रेड 'देता है, जो' गतिविधि 'नहीं है, अकेले' MyActivity' दें। – CommonsWare

+0

मैं सहमत हूं लेकिन एक तरीका होना चाहिए, जहां तक ​​एंड्रॉइड मुझे एसडीके में देता है 'गतिविधि' यूआई थ्रेड का अगला चेहरा है .. मुझे यकीन नहीं है कि 'Looper.getMainLooper() क्यों नहीं है .getThread()। getActivity()/.getContext() 'ईमानदार होने के लिए .. मैं वहां एक होने की उम्मीद कर रहा था। अधिकांश समाधानों के लिए आपको पैरामीटर के रूप में संदर्भ पारित करने की आवश्यकता होती है - लेकिन क्या होगा यदि आपको नहीं पता कि यह कौन सा संदर्भ है या क्या यह एक फॉर्म करीबी घटना है जिसे कार्यकर्ता (मेरे मामले में) कहा जाता है? – conners

0

यदि यह आपकी गतिविधि में है, तो आप केवल doToast() क्यों नहीं कॉल कर सकते?

1

ब्रॉडकास्ट रिसीवर द्वारा कब्जा कर लिया गया कोई इरादा क्यों नहीं भेजता है, तो प्रसारण रिसीवर अधिसूचना ट्रे में एक अधिसूचना बना सकता है। यह टोस्ट नहीं है, लेकिन यह उपयोगकर्ता को सूचित करने का एक तरीका है कि उसकी पोस्ट सफल रही है।

4

यह आपको टोस्ट लॉन्च करने के संदर्भ में संदर्भ पर भरोसा करने की आवश्यकता के बिना संदेश प्रदर्शित करने की अनुमति देगा, केवल संदेश प्रदर्शित करते समय संदर्भ के लिए।

runOnUiThread ओपनजीएल व्यू थ्रेड से काम नहीं कर रहा था और यह समाधान था। आशा करता हूँ की ये काम करेगा।

private Handler handler = new Handler(); 
handler.post(new Runnable() { 
    public void run() { 
     Toast.makeText(activity, "Hello, world!", Toast.LENGTH_SHORT).show(); 
    } 
}); 
1

यदि आपके पास संदर्भ है, तो आप इस तरह के ui धागे को गैर गतिविधि वर्ग से कॉल कर सकते हैं।

((Activity)context).runOnUiThread(new Runnable() { 
    public void run() { 
     // things need to work on ui thread 
    } 
});