ऐसा लगता है कि आपके डीबी प्रश्नों को यूआई थ्रेड से चलाया जाता है, भले ही आप कहते हैं कि एक निर्धारित कार्य क्वेरी (?) चलाता है। सुनिश्चित करने के लिए, आप उस स्टैकट्रेस का प्रिंट आउट ले सकते हैं जहाँ आप डेटाबेस तक पहुँच प्राप्त करते हैं:
new Exception().printStacktrace();
आपके प्रस्तावित समाधान पर:यदि आपके डीबी प्रश्न धीमे हैं और अन्यथा आपके यूआई को फ्रीज कर देंगे तो यह एक सभ्य डिजाइन की तरह लगता है। आप अपनी यूआई परत और डीबी परत के बीच एक घटना प्रणाली को लागू कर सकते हैं, शायद एक साधारण कतार आधारित दृष्टिकोण।
संपादित करें:
घटना आधारित समाधान को लागू करने का तरीका खोजने के लिए सबसे अधिक संभावना वाले उदाहरण हैं।
अस्वीकरण:मैंने कई वर्षों में कोई वास्तविक UI प्रोग्रामिंग नहीं की है।
- उपयोगकर्ता UI में एक बटन क्लिक करता है। UI थ्रेड एक ईवेंट ऑब्जेक्ट (DataWantedEvent) को एक क्यू (java.util.Queue) पर रखता है, एक लेबल बदलता है ("डेटा की प्रतीक्षा कर रहा है...") और फिर आगे बढ़ता है और अन्य उपयोगकर्ता इंटरैक्शन की प्रतीक्षा करता है।
- डीबी लेयर थ्रेड इवेंट को क्यू लेता है और डेटाबेस को क्वेरी करता है। परिणाम ऑब्जेक्ट में किसी अन्य क्यू पर परिणाम वापस पोस्ट किया जाता है।
- एक UI थ्रेड (शायद मुख्य थ्रेड नहीं) परिणाम क्यू से परिणाम ऑब्जेक्ट लेता है और UI को अपडेट करता है।
परिणाम ऑब्जेक्ट को UI पर वापस पोस्ट करने के लिए एक कतार की आवश्यकता नहीं हो सकती है। एक अद्यतन विधि को सीधे लागू किया जा सकता है।
यदि उपयोगकर्ता रद्द करें बटन पर क्लिक करता है, तो अपडेट इवेंट/कॉलबैक को अनदेखा किया जा सकता है या यदि संभव हो, तो डीबी क्वेरी को रद्द किया जा सकता है।