मैं पृष्ठभूमि सेवा का उपयोग कर रहा हूं कि यह डेटा पुनर्प्राप्त कर रहा है और रिमोट सर्वर पर डेटा डाल रहा है। ठीक है, मैंने इसे पृष्ठभूमि सेवा पर रखा क्योंकि मैं अपने ऐप को धीमा किए बिना इसे पृष्ठभूमि में करना चाहता था, लेकिन यह मेरे ऐप को धीमा कर रहा है!

जैसा कि आप कोड में देखेंगे, इसमें 60 सेकंड की नींद है, और मेरा ऐप हर 60 सेकंड में 2/3 सेकंड में जम रहा है, यह कोड है, मुझे यकीन है, लेकिन मुझे नहीं पता कि इसे कैसे हल किया जाए

public class MyService extends Service implements Runnable{
    boolean serviceStopped;
    RemoteConnection con; //conexion remota
    List <Position> positions;
static SharedPreferences settings;
static SharedPreferences.Editor configEditor;
    private Handler mHandler;
    private Runnable updateRunnable = new Runnable() {
        @Override public void run() {
            //contenido
            if (serviceStopped==false)
            {
                positions=con.RetrievePositions(settings.getString("login","")); //traigo todas las posiciones
                if (positions.size()>=10) //si hay 10 borro la mas vieja
                    con.deletePosition(positions.get(0).getIdposition());
                if (settings.getString("mylatitude", null)!=null && settings.getString("mylongitude", null)!=null)
                    con.insertPosition(settings.getString("mylatitude", null),settings.getString("mylongitude", null), formatDate(new Date()), settings.getString("login",""));
            }
            queueRunnable();//duerme
        }
    };
    private void queueRunnable() {
        //mHandler.postDelayed(updateRunnable, 60000); //envia una posicion al servidor cada minuto (60.000 milisegundos es un minuto)
        mHandler.postDelayed(updateRunnable, 60000);
    }

    public void onCreate() {
        serviceStopped=false;
settings = PreferenceManager.getDefaultSharedPreferences(this.getApplicationContext());
        configEditor = settings.edit();
        positions=new ArrayList<Position>();
        con = new RemoteConnection();
            mHandler = new Handler();
            queueRunnable();
        }
1
NullPointerException 2 जून 2011, 13:04

1 उत्तर

सबसे बढ़िया उत्तर

यहां तक ​​​​कि अगर आपने एक सेवा बनाई है तो इसका मतलब यह नहीं है कि यह एक अलग थ्रेड पर चलेगा। एक नज़र डालें http://developer.android.com/reference/android/app/ Service.html

ध्यान दें कि सेवाएं, अन्य एप्लिकेशन ऑब्जेक्ट की तरह, अपनी होस्टिंग प्रक्रिया के मुख्य थ्रेड में चलती हैं। इसका मतलब यह है कि, यदि आपकी सेवा कोई सीपीयू गहन (जैसे एमपी3 प्लेबैक) या ब्लॉकिंग (जैसे नेटवर्किंग) संचालन करने जा रही है, तो उसे अपना स्वयं का धागा बनाना चाहिए जिसमें वह काम करना है। इसके बारे में अधिक जानकारी प्रक्रियाओं और थ्रेड्स में पाई जा सकती है। IntentService वर्ग सेवा के मानक कार्यान्वयन के रूप में उपलब्ध है जिसका अपना धागा है जहां यह अपना काम करने के लिए निर्धारित करता है।

कृपया यह पढ़ने के लिए कुछ समय दें कि एंड्रॉइड में सेवाएं वास्तव में कैसे काम करती हैं http://developer.android .com/guide/topics/fundamentals/services.html

तो, IntentService और शेड्यूल्ड अलर्ट यहां एक समाधान हो सकता है।

2
denis.solonenko 2 जून 2011, 13:50