ক্রিয়াকলাপ <অ্যাপ্লিকেশন নাম> সার্ভিস কানেকশন <পরিষেবা সংযোগের নাম> @ 438030a8 ফাঁস করেছে যা মূলত এখানে আবদ্ধ ছিল


134

আমি আমার প্রথম অ্যান্ড্রয়েড অ্যাপে কাজ করছি। আমি আমার অ্যাপে তিনটি ক্রিয়াকলাপ পেয়েছি এবং ব্যবহারকারী বেশ ঘন ঘন পিছন পিছন স্যুইচ করে। আমি একটি দূরবর্তী পরিষেবা পেয়েছি, যা একটি টেলনেট সংযোগ পরিচালনা করে। অ্যাপ্লিকেশনগুলিকে টেলনেট বার্তাগুলি প্রেরণ / গ্রহণ করতে এই পরিষেবার সাথে আবদ্ধ হওয়া দরকার।

সম্পাদনা করুন আপনার তথ্যমূলক উত্তরের জন্য আপনাকে বিডিএলএস ধন্যবাদ। bindService()স্ট্যান্ড-একা ফাংশন হিসাবে বা তার পরেব্যবহারের মধ্যে পার্থক্য সম্পর্কে আপনার স্পষ্টতার আলোকে আমি আমার কোডটি আবার লিখেছিstartService()এবং ক্রিয়াকলাপগুলির মধ্যে চক্রের পিছনে বোতামটি ব্যবহার করার সময় আমিমাঝে মাঝেকেবলফাঁস ত্রুটি বার্তাটি পাই।

আমার সংযোগ কার্যকলাপ অনুসরণ করেনি onCreate()এবং onDestroy():

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /*
     * Initialize the ServiceConnection.  Note that this is the only place startService() is run.
     * It is also the only time bindService is run without dependency on connectStatus.
     */
    conn = new TelnetServiceConnection();
    //start the service which handles telnet
    Intent i = new Intent();
    i.setClassName( "com.wingedvictorydesign.LightfactoryRemote", "com.wingedvictorydesign.LightfactoryRemote.TelnetService" );
    startService(i);
    //bind to the service
    bindService(i, conn, 0);

    setContentView(R.layout.connect);
    setupConnectUI();

}//end OnCreate()

@Override
protected void onDestroy() {
    super.onDestroy();

    //unbind the service and null it out
    if (conn != null) {
        unbindService(conn);
        conn = null;
        }

    if(connectStatus == 0) {
        //stop the service
        Intent i = new Intent();
        i.setClassName( "com.wingedvictorydesign.LightfactoryRemote", "com.wingedvictorydesign.LightfactoryRemote.TelnetService" );
        stopService(i);
        Log.d("LightfactoryRemote", "Connect onDestroy() attempted to stop service");
        }

    Log.d("LightfactoryRemote", "Connect onDestroy()");
    }//end onDestroy()

সুতরাং ক্রিয়াকলাপ শুরু হওয়ার সাথে সাথে পরিষেবাটি শুরু করা হয়, এবং যদি সফল কোনও টেলনেট সংযোগ না করা হয় তবে কার্যকলাপটি ধ্বংস হয়ে যায় ( connectStatus == 0)। অন্যান্য ক্রিয়াকলাপগুলি কেবলমাত্র সফল সংযোগ তৈরি করা হলে ( connectStatus == 1ভাগ করা পছন্দগুলিতে সংরক্ষণ করা হয়) সেবার সাথে আবদ্ধ । এখানে তাদের onResume()এবং onDestroy():

@Override
protected void onResume() {
    super.onResume();

    //retrieve the shared preferences file, and grab the connectionStatus out of it.
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_WORLD_WRITEABLE);
    connectStatus = settings.getInt("connectStatus", 0);

    Log.d("LightfactoryRemote", "Focus onResume with " + connectStatus);

    //if a telnet connection is active, start the service and bind to it
    if (connectStatus == 1) {
        conn = new TelnetServiceConnection();
        Intent i = new Intent();
        i.setClassName("com.wingedvictorydesign.LightfactoryRemote", "com.wingedvictorydesign.LightfactoryRemote.TelnetService");
        bindService(i, conn, 0);
        //TODO write restore texview code
        }//end if
    }//end onResume

@Override
protected void onDestroy() {
    super.onDestroy();
    //unbind the service and null it out.
    if (conn != null) {
        Log.d("LightfactoryRemote", "Focus onDestroy() attempted to unbind service");
        unbindService(conn);
        conn = null;
        }
    Log.d("LightfactoryRemote", "Focus onDestroy()");
    }//end onDestroy()

তাই বাধ্যতামূলকটি ঘটে onResume()যাতে এটি সংযোগ ক্রিয়াকলাপ থেকে পরিবর্তিত রাষ্ট্রটি গ্রহণ করে এবং onDestroy()প্রয়োজনে ফাংশনে এটি আনবাউন্ড হয়।

সম্পাদনা শেষ করুন

তবে আমি এখনও মেমরি ফাঁস ত্রুটি বার্তাটি পেয়েছি "ক্রিয়াকলাপ সার্ভিস কানেকশনটি @ 438030a8 ফাঁস করেছে যা ক্রিয়াকলাপগুলি স্যুইচ করার সময় মাঝে মাঝে" বন্ধ হয়ে যায় "" আমি কি ভুল করছি?

কোন পরামর্শ বা পয়েন্টার জন্য আগাম ধন্যবাদ !!!

সম্পূর্ণ ত্রুটি বার্তা অনুসরণ করে (সংশোধিত কোড থেকে):

01-02 22:04:26.642: DEBUG/LightfactoryRemote(2024): Focus onStop()
01-02 22:04:26.642: DEBUG/LightfactoryRemote(2024): Focus onDestroy() attempted to unbind service
01-02 22:04:26.642: DEBUG/LightfactoryRemote(2024): Focus onDestroy()
01-02 22:04:26.672: ERROR/ActivityThread(2024): Activity com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote has leaked ServiceConnection com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote$TelnetServiceConnection@439e51e8 that was originally bound here
01-02 22:04:26.672: ERROR/ActivityThread(2024): android.app.ServiceConnectionLeaked: Activity com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote has leaked ServiceConnection com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote$TelnetServiceConnection@439e51e8 that was originally bound here
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread$PackageInfo$ServiceDispatcher.<init>(ActivityThread.java:927)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread$PackageInfo.getServiceDispatcher(ActivityThread.java:822)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ApplicationContext.bindService(ApplicationContext.java:842)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.content.ContextWrapper.bindService(ContextWrapper.java:319)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote.onResume(LightfactoryRemote.java:102)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1225)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.Activity.performResume(Activity.java:3559)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2838)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2866)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2420)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread.access$2100(ActivityThread.java:116)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.os.Looper.loop(Looper.java:123)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at android.app.ActivityThread.main(ActivityThread.java:4203)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at java.lang.reflect.Method.invokeNative(Native Method)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at java.lang.reflect.Method.invoke(Method.java:521)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
01-02 22:04:26.672: ERROR/ActivityThread(2024):     at dalvik.system.NativeStart.main(Native Method)
01-02 22:04:26.692: WARN/ActivityManager(558): Unbind failed: could not find connection for android.os.BinderProxy@43c509a8


2 য় ধন্যবাদ সম্পাদনা করুন আবার আপনার পরামর্শের জন্য বিডিএল। আপনার পরামর্শ অনুসারে আমি করেছি এবংonUnBind()পরিষেবাতে ওভাররাইডযুক্ত করেছি। onUnBind()সমস্ত ক্লায়েন্ট পরিষেবা থেকে সংযোগ বিচ্ছিন্ন করার পরে কেবল তখনই ট্রিগার করা হয়, তবে আমি যখন হোম বোতামটি আঘাত করি তখন এটি কার্যকর হয়, ত্রুটি বার্তাটি পপ আপ হয়! এটি আমার কাছে কোনও ধারণা রাখে না, যেহেতু সমস্ত ক্লায়েন্টগুলি পরিষেবা থেকে আনবাউন্ড হয়েছে, সুতরাং কীভাবে ধ্বংস হওয়া ব্যক্তিটি একটি পরিষেবা সংযোগ ফাঁস করতে পারে? এটা দেখ:

01-03 19:38:30.837: DEBUG/LightfactoryRemote(1118): Focus onPause()1
01-03 19:38:31.577: WARN/IInputConnectionWrapper(1118): showStatusIcon on inactive InputConnection
01-03 19:38:31.587: DEBUG/LightfactoryRemote(1118): Focus onStop()
01-03 19:38:31.600: DEBUG/LightfactoryRemote(1118): Focus onDestroy() attempted to unbind service
01-03 19:38:31.607: DEBUG/LightfactoryRemote(1118): Focus onDestroy()
01-03 19:38:31.677: DEBUG/LightfactoryRemote(1125): TelnetService onUnBind()
01-03 19:38:31.727: ERROR/ActivityThread(1118): Activity com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote has leaked ServiceConnection com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote$TelnetServiceConnection@435baeb0 that was originally bound here
01-03 19:38:31.727: ERROR/ActivityThread(1118): android.app.ServiceConnectionLeaked: Activity com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote has leaked ServiceConnection com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote$TelnetServiceConnection@435baeb0 that was originally bound here
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread$PackageInfo$ServiceDispatcher.<init>(ActivityThread.java:886)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread$PackageInfo.getServiceDispatcher(ActivityThread.java:781)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ApplicationContext.bindService(ApplicationContext.java:820)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.content.ContextWrapper.bindService(ContextWrapper.java:307)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at com.wingedvictorydesign.LightfactoryRemote.LightfactoryRemote.onResume(LightfactoryRemote.java:102)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1225)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.Activity.performResume(Activity.java:3530)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2619)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2647)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2287)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread.access$1800(ActivityThread.java:112)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1692)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.os.Looper.loop(Looper.java:123)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at android.app.ActivityThread.main(ActivityThread.java:3948)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at java.lang.reflect.Method.invokeNative(Native Method)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at java.lang.reflect.Method.invoke(Method.java:521)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
01-03 19:38:31.727: ERROR/ActivityThread(1118):     at dalvik.system.NativeStart.main(Native Method)
01-03 19:38:31.777: WARN/ActivityManager(564): Unbind failed: could not find connection for android.os.BinderProxy@4370f8a8

আমি ভেবেছিলাম এটি আপনার মতো বলে কিছু হতে পারে, যেখানে পরিষেবাটির কাছে বাধ্যতামূলক ডাক দেওয়ার সময় সম্পূর্ণ হয় না unbindService(), তবে আমি বাধ্যতামূলকভাবে সম্পূর্ণ হয়েছে কিনা তা যাচাই করার জন্য প্রতিটি ক্রিয়াকলাপের সাহায্যে আমি সেবার একটি পদ্ধতি কল করার চেষ্টা করেছি, এবং তারা সবাই গেল জরিমানা মাধ্যমে।

সাধারণভাবে, এই আচরণটি প্রতিটি ক্রিয়াকলাপে আমি কতদিন থাকি তার সাথে সম্পর্কিত বলে মনে হয় না। প্রথম ক্রিয়াকলাপটি একবার তার সার্ভিস কানেকশন ফাঁস হয়ে গেলে, তারপরে, তাদের পরে আমি তাদের মাধ্যমে ফিরে আসার মতো তারা সকলে করে।

অন্য একটি জিনিস, যদি আমি দেব সরঞ্জামগুলিতে "তত্ক্ষণাত্ ক্রিয়াকলাপগুলি ধ্বংস করে" চালু করি তবে এটি এই ত্রুটিটি রোধ করে।

কোন ধারনা?


আপনি কি হালকা কারখানাRemote.onCreate () কোড যুক্ত করতে পারেন? (com. Wingedvictorydesign.LightfactoryRemote.LightfactoryRemote.onCreate (লাইটফ্যাক্টরিরমোট.জভা: ৯7))
tbruyelle

উত্তর:


57

আপনি আপনার কোডগুলির কোনও সরবরাহ করেন নি LightFactoryRemote, সুতরাং এটি কেবলমাত্র একটি অনুমান, তবে আপনি যদি bindServiceপদ্ধতিটি নিজের মতো করে ব্যবহার করছেন তবে আপনি যে ধরণের সমস্যা দেখছেন তা দেখে মনে হচ্ছে এটির মতো ।

কোনও পরিষেবা চলমান রাখা হয়েছে তা নিশ্চিত করার জন্য, যে ক্রিয়াকলাপটি শুরু হয়েছে তার onDestroyপদ্ধতিটি কল করার পরেও এটি প্রথমে আপনার ব্যবহার করা উচিত startService

স্টার্ট সার্ভিস স্টেটের জন্য অ্যান্ড্রয়েড ডক্স :

স্টার্ট সার্ভিস () ব্যবহার করে ডিফল্ট পরিষেবা জীবনকালকে ওভাররাইড করে যা বাইন্ডসার্ভিস (ইনটেন্ট, সার্ভিস কানেকশন, ইনট) দ্বারা পরিচালিত হয়: কোনও ক্লায়েন্টের সাথে সংযুক্ত কিনা তা নির্বিশেষে স্টপ সার্ভিস (ইনট্যান্ট) না বলা পর্যন্ত এটি চলমান থাকা প্রয়োজন।

যদিও বাইন্ড সার্ভিসের জন্য :

পরিষেবাটি কেবল ততক্ষণ কলিং প্রসঙ্গ বিদ্যমান থাকার জন্য সিস্টেম দ্বারা প্রয়োজনীয় হিসাবে বিবেচিত হবে। উদাহরণস্বরূপ, যদি এই প্রসঙ্গে কোনও ক্রিয়াকলাপ বন্ধ হয়ে যায় তবে ক্রিয়াকলাপটি আরম্ভ না করা অবধি পরিষেবাটি চালিয়ে যাওয়া প্রয়োজন হবে না।


সুতরাং যা ঘটেছে তা হল পরিষেবাটি আবদ্ধ (এবং তাই শুরু করা) কার্যকলাপ বন্ধ করা হয়েছে এবং এইভাবে সিস্টেমটি মনে করে যে পরিষেবাটির আর প্রয়োজন নেই এবং সেই ত্রুটির কারণ ঘটায় (এবং সম্ভবত পরিষেবাটি থামিয়ে দেয়)।


উদাহরণ

কলিং ক্রিয়াকলাপ চলছে কিনা তা এই উদাহরণে পরিষেবাটি চলমান রাখা উচিত।

ComponentName myService = startService(new Intent(this, myClass.class));
bindService(new Intent(this, myClass.class), myServiceConn, BIND_AUTO_CREATE);

প্রথম লাইনটি পরিষেবাটি শুরু করে এবং দ্বিতীয়টি এটিকে ক্রিয়াকলাপের সাথে আবদ্ধ করে।


আমি START_STICKY ব্যবহার করে পরিষেবাটি শুরু করি এবং এটি বুট অভিপ্রায় দ্বারাও শুরু হয়েছিল। আমি যদি স্টার্ট সার্ভিসকে কল করি তবে এটি পরিষেবার আরও একটি উদাহরণ তৈরি করে এবং আমি একই সাথে 2 টি পরিষেবা চলমান চাই না। এই ক্ষেত্রে আমি কীভাবে ত্রুটিটি ঠিক করতে পারি?
opc0de

16
@ opc0de, না আপনি যখন দুটিবার স্টার্ট সার্ভিস () কল করবেন তখন আপনি আর কোনও পরিষেবা তৈরি করছেন না। পরিষেবাদি প্রকৃতির দ্বারা যৌক্তিকভাবে একক। আপনি এটি কতবার শুরু করুন তা নয়, কেবল একটি পরিষেবা চালিত হয়।
mahkie

2
সঙ্গীত প্লেয়ারের পটভূমিতে পরিষেবা চালিয়ে যাওয়ার সমাধান কী?
আনন্দ সাবজানি


31

আপনি বাঁধা onResumeকিন্তু বাঁধাই onDestroyonPauseপরিবর্তে আপনার আনবাইন্ডিংটি করা উচিত , যাতে সর্বদা বন্ধন / আনবাইন্ড কলগুলির মিল থাকে। আপনার ক্রিয়াকলাপ ত্রুটিগুলি এমন হবে যেখানে আপনার ক্রিয়াকলাপটি বিরতি দেওয়া হয়েছে তবে ধ্বংস হয় নি এবং আবার পুনরায় শুরু করা হয়েছে।


13

আপনার কেবল পরিষেবাটি আবদ্ধ করতে হবে onDestroy()। তারপরে, সতর্কতা চলে যাবে।

এখানে দেখুন ।

ক্রিয়াকলাপ ডকটি ব্যাখ্যা করার চেষ্টা করার সাথে সাথে, আপনি ব্যবহার করবেন এমন তিনটি প্রধান বাঁধাই / আনবাইন্ড গ্রুপিং রয়েছে: অনক্রিট () এবং অনডাস্ট্রয় (), অন স্টার্ট () এবং অনস্টপ (), এবং অন রিসুম () এবং অনপজ ()।


7
যেহেতু আপনি অনারত থাকতে পারেনড্রেস্ট্রয় অপারেটিং সিস্টেম থেকে খুব বেশি কখনও ডাকা হয় না
শহীদলাবিটজ

নিষিদ্ধ সামগ্রী -> নিষিদ্ধ সামগ্রী সতর্কতার জন্য এখানে লিঙ্কের ফরোয়ার্ডগুলি দেখুন। কেউ কি অ্যাক্সেস পেতে পারেন? "গ্রুপ অবিরত করুন" বোতামটি কেবল পৃষ্ঠাটি সতেজ করে এবং আমার জন্য একই সতর্কতা দেখায়।
ব্লেজ গাওয়ালিক

11

আপনি খুব দ্রুত ক্রিয়াকলাপগুলির মধ্যে ব্যবহারকারী স্যুইচিংয়ের কথা উল্লেখ করেন। এটি কি এমন হতে পারে যে unbindServiceপরিষেবা সংযোগ স্থাপনের আগে আপনি কল করছেন ? এটি আনবাইন্ড ব্যর্থ হওয়ার পরে আবদ্ধ হওয়ার ফাঁকে প্রভাব ফেলতে পারে।

আপনি কীভাবে এটি পরিচালনা করতে পারবেন তা পুরোপুরি নিশ্চিত নয় ... সম্ভবত যখন onServiceConnectedডাকা হয় তখনই আপনাকে ফোন করা unbindServiceযেতে পারে onDestroyalready নিশ্চিত যে এটি কাজ করবে কিনা।


আপনি যদি ইতিমধ্যে না থাকেন তবে আপনি আপনার সেবার একটি অনউবাইন্ড পদ্ধতি যুক্ত করতে পারেন। আপনার ক্লাসগুলি কখন এ থেকে আবদ্ধ হয় ঠিক সেভাবে আপনি দেখতে পারেন এবং এটি ডিবাগিংয়ে সহায়তা করতে পারে।

@Override
public boolean onUnbind(Intent intent) {
    Log.d(this.getClass().getName(), "UNBIND");
    return true;
}

2

অনউসারলাইভহিন্ট ()-এ আনবাইন্ডসেসওয়ার () ব্যবহার করার চেষ্টা করুন। এটি সার্ভিস কানেকশনের ফাঁস হওয়া দৃশ্য এবং অন্যান্য ব্যতিক্রমগুলি প্রতিরোধ করে।
আমি আমার কোডে এটি ব্যবহার করেছি এবং সূক্ষ্মভাবে কাজ করি।


1

আপনি এটি কেবল একটি বুলিয়ান দিয়ে নিয়ন্ত্রণ করতে পারেন, তাই বাঁধাই করা থাকলে আপনি কেবল আনবাইন্ডকে কল করুন

public void doBindService()
{
    if (!mIsBound)
    {
        bindService(new Intent(this, DMusic.class), Scon, Context.BIND_AUTO_CREATE);
        mIsBound = true;
    }
}

public void doUnbindService()
{
    if (mIsBound)
    {
        unbindService(Scon);
        mIsBound = false;
    }
}

আপনি যদি কেবল এটি সংযোগযুক্ত হয়ে থাকে তবেই এটি আবদ্ধ করতে চান

public ServiceConnection Scon = new ServiceConnection() {

    public void onServiceConnected(ComponentName name, IBinder binder)
    {
        mServ = ((DMusic.ServiceBinder) binder).getService();
        mIsBound = true;
    }

    public void onServiceDisconnected(ComponentName name)
    {
        mServ = null;
    }
};

0

ক্রিয়াকলাপে আবদ্ধ প্রতিটি পরিষেবা অবশ্যই অ্যাপ্লিকেশন বন্ধে আনবাইন্ড হওয়া উচিত।

তাই ব্যবহার করার চেষ্টা করুন

 onPause(){
   unbindService(YOUR_SERVICE);
   super.onPause();
 }

0

আমি খুব সম্প্রতি অ্যান্ড্রয়েড পরিষেবা সম্পর্কে পড়ছি এবং এটিতে গভীর ডুব দেওয়ার সুযোগ পেয়েছি। আমি একটি পরিষেবা ফাঁসের মুখোমুখি হয়েছি, আমার পরিস্থিতির জন্য এটি হয়েছিল কারণ আমার একটি আনবাউন্ড পরিষেবা ছিল যা একটি সীমাবদ্ধ পরিষেবা শুরু করছিল , তবে এতে আমার আনবাউন্ড পরিষেবাটি একটি ক্রিয়াকলাপ দ্বারা প্রতিস্থাপিত হয় ।

সুতরাং যখন আমি স্টপসেলফ () ব্যবহারের মাধ্যমে আমার আনবাউন্ড পরিষেবা বন্ধ করছিলাম তখন লিকটি দেখা দিয়েছে, কারণটি ছিল আমি সীমাবদ্ধ পরিষেবাটি আবদ্ধ না করে পিতামাতার পরিষেবাটি বন্ধ করছিলাম । এখন বাউন্ড সার্ভিস চলছে এবং এটি কার সাথে সম্পর্কিত তা জানে না।

সহজ এবং সোজা ফরোয়ার্ড ফিক্স হ'ল আপনার আনবাইন্ড সার্ভিস (YOUR_SERVICE) কল করা উচিত ; আপনার onDestroy () আপনার পিতা বা মাতা ভ্রমণ / সার্ভিস ফাংশন। এইভাবে আপনার আধ্যাত্মিক ক্রিয়াকলাপ / পরিষেবাগুলি নিচে যাওয়ার আগে আপনার সীমাবদ্ধ পরিষেবাদিগুলি বন্ধ বা পরিষ্কার করা নিশ্চিত করবে will

এই সমস্যার আরও একটি ভিন্নতা রয়েছে। কখনও কখনও আপনার আবদ্ধ পরিষেবায় আপনি নির্দিষ্ট ফাংশনগুলি কেবল তখনই কাজ করতে চান যদি পরিষেবাটি সীমাবদ্ধ থাকে তাই আমরা সার্ভিসটিতে সংযুক্ত যেমন একটি সীমাবদ্ধ পতাকা রেখেছি :

public void onServiceConnected(ComponentName name, IBinder service) {
            bounded = true;
            // code here
        }

এটি এখানে অব্যাহতভাবে কাজ করে তবে সমস্যাটি তখনই আসে যখন আমরা অনসাইনসার্ভিশন ফাংশন কলের কলব্যাক হিসাবে সার্ভিস-ডিসকনেক্টেড ফাংশনটিকে চিকিত্সা করি , ডকুমেন্টেশন দ্বারা কেবল তখনই বলা হয় যখন কোনও পরিষেবা মারা যায় বা ক্র্যাশ হয় । এবং আপনি একই থ্রেডে এই কলব্যাকটি কখনই পাবেন না । অতএব, আমরা এখানে কিছু করা শেষ করি:

public void onServiceDisconnected(ComponentName name) {
            bounded = false;
        }

কোডে বড় বাগ তৈরি করে কারণ আমাদের আবদ্ধ পতাকাটি কখনই মিথ্যাতে পুনরায় সেট হয় না এবং যখন এই পরিষেবাটি আবার যুক্ত হয় তখন বেশিরভাগ সময় true। সুতরাং এই দৃশ্যটি এড়াতে boundআপনার কল করা মুহুর্তটি ভুয়াতে সেট করা উচিত unbindService

এটি এরিকের ব্লগে আরও বিস্তারিতভাবে কভার করা হয়েছে ।

আশা করি কে এখানে এসেছে তার কৌতূহল সন্তুষ্ট হয়েছে।


0

এই ত্রুটিটি ঘটে যখন আপনি একটি সীমাবদ্ধ পরিষেবা বাঁধতে চলেছেন। সুতরাং, সল হতে হবে: -

  1. পরিষেবা সংযোগে পরিষেবা হিসাবে বাঁধন নীচে হিসাবে যুক্ত করুন:

    private final ServiceConnection serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // your work here.
    
        serviceBound = true;
    
    }
    
    @Override
    public void onServiceDisconnected(ComponentName name) {
    
        serviceBound = false;
    }

    };

  2. ডিসট্রয় অনবাইন্ড পরিষেবা

        if (serviceBound) {
            unbindService(serviceConnection);
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.