मेरे पास एक ऑनक्लिक लिस्टनर है जो नेटवर्क कॉल ट्रिगर करता है, इसलिए मैं उपयोगकर्ता को यह दिखाने का कोई तरीका चाहता हूं कि संचार प्रगति पर है। जिस समस्या में मैं दौड़ रहा हूं वह यह है कि मैं ऑनक्लिक श्रोता के अंदर कॉल करने से पहले उस मामले के लिए किसी भी तरह से प्रोग्रेसडिअलॉग फेंकने या यूआई को किसी भी तरह से परिवर्तित नहीं कर सकता। सभी कोड ठीक काम करता है, लेकिन यूआई परिवर्तन तब तक प्रभावी नहीं होते जब तक कि क्लिकक्लिस्टरर के सभी कोड चलने के बाद तक।क्या ऑनक्लिक लिस्टनर यूआई अपडेट नहीं करता है जब तक कि इसके अंदर के सभी कोड एंड्रॉइड में नहीं चलते?
मैं अगर मेरी समस्या केवल यह है कि एक onclicklistener की तरह एक गुमनाम आंतरिक वर्ग केवल अपनी दौड़ के अंत में यूआई अद्यतन कर सकते हैं है सोच रहा था? या शायद मेरा कोड बस खराब है।
relayButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cPanel.throwProgress(NCDTCPRelayActivity.this);
System.out.println(tvSocketConnection.getText().toString());
if (relayStatusArray[relayNumber] == 0)
{
if (cPanel.TurnOnRelay(relayNumber, 1) == false)
{
changeTitleToRed();
}else{
changeTitleToGreen();
}
}
else {
if (cPanel.TurnOffRelay(relayNumber, 1) == false){
changeTitleToRed();
}else{
changeTitleToGreen();
}
}
cPanel.hideProgress(NCDTCPRelayActivity.this);
}
});
यहाँ throwProgress और hideProgress क्रमशः (इन गतिविधियों का एक उपवर्ग में हैं) के लिए कोड है::
अग्रिम
नीचे धन्यवाद onclick श्रोता के लिए कोड है
public boolean throwProgress(Context mContext) {
System.out.println("INSIDE THROWPROGRESS");
try {
tempDialog = ProgressDialog.show(mContext, "Connecting", "Connecting", true);
}
catch (RuntimeException e) {
return false;
}
return true;
}
public boolean hideProgress(Context mContext) {
System.out.println("OUTSIDE THROWPROGRESS");
tempDialog.hide();
return true;
}
** संपादित करें ऑनक्लिक लिस्टनर के लिए नया कोड यहां दिया गया है कि मैंने इसे चलाने योग्य:
public void onClick(View v) {
cPanel.throwProgress(NCDTCPRelayActivity.this);
System.out.println(tvSocketConnection.getText().toString());
handler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (relayStatusArray[relayNumber] == 0)
{
if (cPanel.TurnOnRelay(relayNumber, 1) == false)
{
changeTitleToRed();
}else{
changeTitleToGreen();
}
}
else {
if (cPanel.TurnOffRelay(relayNumber, 1) == false){
changeTitleToRed();
}else{
changeTitleToGreen();
}
}
cPanel.hideProgress(NCDTCPRelayActivity.this);
relayStatusArray = cPanel.getBankStatus(1);
updateButtonText();
}
});
}
खैर नेटवर्क कॉल एक AsyncTask पर है, लेकिन मैं AsyncTask()। निष्पादित()। (मिल) पद्धति का उपयोग इतना है कि ui धागा क्योंकि पूरे कार्यक्रम हो रही उन नेटवर्क के लिए आदेश के लिए प्रयोग किया जाता है प्रतिक्रिया के लिए इंतजार करेंगे लक्ष्य और प्रतिक्रिया वापस लेना। यह सिर्फ एक काम है ताकि हमें मुख्य धागे पर नेटवर्क का अपवाद न मिले। हालांकि कॉल के पहले कोड कोड के पहले कोड से पहले निष्पादित नहीं किया जाएगा? – Poodimizer
मुख्य धागे में get() को कॉल न करें। AsyncTask.onPostExecute() को ओवरराइड करें और वहां प्रतिक्रिया को संभालें। – gngr44
@Poodimizer ऐसा मत करो! आप असीमित रूप से विस्तृत * तुल्यकालिक * कार्य में बदलकर 'AsyncTask' के पूरे उद्देश्य को प्रभावी ढंग से हरा रहे हैं! – Santa