android - AsyncTask पर आग घटना समाप्त हो गई




interface android-asynctask (2)

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

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

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

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

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

सादर, एरिक


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

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


सबसे पहले, 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();
    }
}

दूसरी ओर, अपना वर्ग (विस्तारित प्रसारण रिसीवर) बनाएं, जो एक पद समाप्त होने पर आशय प्राप्त करता है।

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);




android-event