2013-01-25 45 views
5

समाप्त हुआ मेरे ऐप में एक लॉगिन गतिविधि है और यह इंटरनेट वेबसाइट के माध्यम से प्रमाण-पत्र की जांच करता है। ऐसा करने के लिए, मुझे एक AsyncTask क्लास का उपयोग करना है। जब लॉगिन सफल होता है, तो एक वैश्विक चर सत्य पर सेट होता है।AsyncTask पर फायर इवेंट

क्योंकि यह असीमित है, गतिविधि परिणाम की प्रतीक्षा नहीं करेगी, इसलिए मैं AsyncTask क्लास के बाद-निष्पादन विधि द्वारा निकाल दिया गया एक ईवेंट जोड़ना चाहता हूं। फिर लॉगिन गतिविधि पर listener स्वयं बंद हो जाएगा और मुख्य गतिविधि दिखाई देगी।

मैं जानना चाहता हूं कि यह और कैसे संभव है। मैंने अन्य पदों से कुछ उदाहरणों का प्रयास किया है, लेकिन उनसे इसे समझ नहीं सकता है।

मुझे लगता है कि मैं निम्नलिखित करना है: - AsyncTask वर्ग में एक interface बना सकते हैं - उस वर्ग के post_execute विधि से, मैं घटना बढ़ा है, लेकिन कैसे? - लॉगिन गतिविधि में listener डालिये, लेकिन कैसे?

किसी भी मदद की सराहना की जाती है।

सादर, एरिक

+1

आप आसानी से इस बात के लिए एक BroadcastReceiver बना सकते हैं, हालांकि आप भी एक समर्पित लॉगिन गतिविधि कर सकते हैं, तो इंतज़ार कर एक बार काम पूरा करता है या तो एक नया गतिविधि या 'खत्म() का शुभारंभ उपयोगकर्ता रखने' वर्तमान एक जाने के लिए वापस। –

+0

क्या आपने 'हैंडलर' की कोशिश की है? यदि नहीं, तो एक बार कोशिश करें। –

उत्तर

5

मैं एक घटना है कि द्वारा सक्रिय किया जाता है जोड़ना चाहते हैं के बाद अमल AsyncTask वर्ग की विधि। फिर लॉगिन गतिविधि पर एक श्रोता स्वयं बंद हो जाएगा और मुख्य गतिविधि दिखाई देगी।

onPostExecute() पहले से ही एक कॉलबैक है, तो आप वर्णन की तरह एक और कॉलबैक बना सकते हैं लेकिन यह अनावश्यक है। बस अपनी AsyncTask में अपनी लॉगिन गतिविधि का संदर्भ पास करें, फिर finish() और startActivity() पर onPostExecute() पर कॉल करने के लिए इसका उपयोग करें।

2

सबसे पहले, निम्नलिखित की तरह Asynctask या IntentService का उपयोग कर, अपनी पोस्ट वर्ग बनाने ...

public class PostIntentService extends IntentService implements PostTask.Observer { 
    private int counter = 0; 
    private int retry = 2; 
    private Data mData; 

    public PostIntentService() { 
     super("PostIntentService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     mData = (Data) intent.getSerializableExtra("data"); 
     // send updating status 
     Intent i = new Intent(); 
     i.setAction(PostResponseReceiver.ACTION_RESPONSE); 
     i.addCategory(Intent.CATEGORY_DEFAULT); 
     i.putExtra("status", "updating"); 
     sendBroadcast(i); 
     execute(); 
     counter++; 
    } 

    @Override 
    public void onSuccessPost(String result) { 
     // send success status 
     Intent i = new Intent(); 
     i.setAction(PostResponseReceiver.ACTION_RESPONSE); 
     i.addCategory(Intent.CATEGORY_DEFAULT); 
     i.putExtra("status", "success"); 
     sendBroadcast(i); 
    } 

    @Override 
    public void onFailedPost(String result) { 
     if (counter < retry) { 
      execute(); 
      counter++; 
     } 
     else { 
      // send failed status 
      Intent i = new Intent(); 
      i.setAction(PostResponseReceiver.ACTION_RESPONSE); 
      i.addCategory(Intent.CATEGORY_DEFAULT); 
      i.putExtra("status", "failed"); 
      i.putExtra("data", mData);// for reproduct 
      sendBroadcast(i); 
     } 
    } 
    private void execute() { 
     PostTask task = new PostTask(this); 
     task.execute(); 
    } 
} 

दूसरे में, अपने वर्ग (बढ़ाया BroadcastReceiver) जो आशय जब एक पोस्ट समाप्त प्राप्त करता है बनाएँ।

public class PostBroadcastReceiver extends BroadcastReceiver { 
    public static final String ACTION_RESPONSE = "com.example.android.intent.action.POST_PROCESSED"; 
    private static final int POST_REQUEST = 100; 
    private Observer mObserver; 

    public PostBroadcastReceiver(Observer observer) { 
     mObserver = observer; 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getStringExtra("status").equals("updating")) { 
     } 
     else if (intent.getStringExtra("status").equals("success")) { 
      if (mObserver != null) { 
       mObserver.onPostFinished(); 
      } 
     } 
     else if (intent.getStringExtra("status").equals("failed")) { 
      if (mObserver != null) { 
       mObserver.onPostFailed(); 
      } 
     } 
    } 

    public interface Observer { 
     public void onPostFinished(); 
     public void onPostFailed(); 
    } 
} 

इस सेवा को अपनी मैनिफेस्ट फ़ाइल में पंजीकृत करें।

<service android:name=".PostIntentService" /> 

इस मुख्य व्यक्ति को अपनी मुख्य गतिविधि के निर्माण में पंजीकृत करें।

IntentFilter filter = new IntentFilter(PostBroadcastReceiver.ACTION_RESPONSE); 
filter.addCategory(Intent.CATEGORY_DEFAULT); 
receiver = new PostResponseReceiver(this); 
registerReceiver(receiver, filter); 

और अपनी मुख्य गतिविधि में निम्न विधि लागू करें।

public void onPostFinished() { 
    Log.d("onPostFinished", "onPostFinished"); 
} 
public void onPostFailed() { 
    Log.d("onPostFailed", "onPostFailed"); 
} 

भूलें मत भूलना इस मुख्य व्यक्ति को अपने मुख्य गतिविधि के डेस्ट्रॉय में पंजीकृत करें।

unregisterReceiver(receiver); 

अंत में, अपनी लॉगिन गतिविधि में स्थानांतरण निष्पादित करें।

Intent intent = new Intent(this, PostIntentService.class); 
intent.putExtra("data", mData); 
startService(intent); 
+0

धन्यवाद। लेकिन मुझे लगता है कि यह अभी मेरे सिर पर थोड़ा सा है। – Eric