java.lang.IllegalStateException: খণ্ডটি ক্রিয়াকলাপের সাথে সংযুক্ত নয়


148

এপিআই কল করার সময় আমি খুব কমই এই ত্রুটিটি পাচ্ছি।

java.lang.IllegalStateException: Fragment  not attached to Activity

isAdded()খণ্ডটি বর্তমানে তার ক্রিয়াকলাপে যুক্ত হয়েছে কিনা তা পরীক্ষা করার জন্য আমি কোডটির অভ্যন্তরে কোডটি দেওয়ার চেষ্টা করেছি তবে তবুও আমি খুব কমই এই ত্রুটিটি পাই। আমি এখনও কেন এই ত্রুটিটি পাচ্ছি তা বুঝতে ব্যর্থ হয়েছি। আমি কীভাবে এটি প্রতিরোধ করতে পারি?

লাইনে এটির ত্রুটি দেখানো হচ্ছে-

cameraInfo.setId(getResources().getString(R.string.camera_id));

নীচে আমি করছি যে নমুনা এপি কল am

SAPI.getInfo(getActivity(),
                new APIResponseListener() {
                    @Override
                    public void onResponse(Object response) {


                        cameraInfo = new SInfo();
                        if(isAdded()) {
                            cameraInfo.setId(getResources().getString(R.string.camera_id));
                            cameraInfo.setName(getResources().getString(R.string.camera_name));
                            cameraInfo.setColor(getResources().getString(R.string.camera_color));
                            cameraInfo.setEnabled(true);
                        }


                    }

                    @Override
                    public void onError(VolleyError error) {
                        mProgressDialog.setVisibility(View.GONE);
                        if (error instanceof NoConnectionError) {
                            String errormsg = getResources().getString(R.string.no_internet_error_msg);
                            Toast.makeText(getActivity(), errormsg, Toast.LENGTH_LONG).show();
                        }
                    }
                });

cameraInfo.setId (।। getActivity () getResources () GetString, (R.string.camera_id));
আশ্বিন এইচ

উত্তর:


203

এই ত্রুটিটি দুটি কারণের সংযুক্ত প্রভাবের কারণে ঘটে:

  • এইচটিটিপি অনুরোধটি সম্পূর্ণ হওয়ার পরে, পূর্ববর্তী স্থানে রয়েছে কিনা তা জেনে onResponse()বা না হয়ে onError()(যা মূল থ্রেডে কাজ করে) আবেদন করে Activity। যদি Activityচলে যায় (ব্যবহারকারী অন্য কোথাও নেভিগেট করে), getActivity()শূন্য ফিরে আসে।
  • ভলিকে Responseএকটি বেনামি অভ্যন্তরীণ শ্রেণি হিসাবে প্রকাশ করা হয়েছে, যা স্পষ্টভাবে বাইরের Activityশ্রেণির একটি দৃ .় রেফারেন্স ধারণ করে । এর ফলে ক্লাসিকের মেমরি ফাঁস হয়।

এই সমস্যাটি সমাধান করতে আপনার সর্বদা করা উচিত:

Activity activity = getActivity();
if(activity != null){

    // etc ...

}

এবং, ব্যবহার isAdded()মধ্যে onError()পাশাপাশি পদ্ধতি:

@Override
public void onError(VolleyError error) {

    Activity activity = getActivity(); 
    if(activity != null && isAdded())
        mProgressDialog.setVisibility(View.GONE);
        if (error instanceof NoConnectionError) {
           String errormsg = getResources().getString(R.string.no_internet_error_msg);
           Toast.makeText(activity, errormsg, Toast.LENGTH_LONG).show();
        }
    }
}

2
ভলির অনুরোধগুলি ও AsyncTaskএর মধ্যে থেকে ব্যবহার করার সময় Activity, এনপিইগুলি এড়ানোর কোনও বোকা উপায় নেই। Activityথ্রেডগুলির মধ্যে একটি ব্যাকগ্রাউন্ডে কিছু করার সময় ব্যবহারকারী বর্তমান থেকে দূরে নেভিগেট করতে পারে এমন সম্ভাবনা সবসময়ই থাকে এবং তার পরে যখন থ্রেডটি সম্পূর্ণ হয় এবং onPostExecute()বা onResponse()ডাকা হয় তখন কিছুই নেই Activity। আপনি যা করতে পারেন তা হ'ল আপনার কোডের বিভিন্ন পয়েন্টে নাল রেফারেন্সের জন্য চেক করা এবং এটি বুলেটপ্রুফ নয় :)
ওয়াইএস

2
অ্যান্ড্রয়েড বানর পরীক্ষা (অ্যাডবি শেল বানর) যদি আপনি ইতিমধ্যে জেনেরিক / গ্লোবাল ফ্যাশনে অ্যাকাউন্ট না করে থাকেন তবে এই ত্রুটিটি নির্মূল করতে সত্যিই ভাল।
গ্রোভ 60

5
isAdded () যথেষ্ট, চূড়ান্ত পাবলিক বুলিয়ান isAdded () {রিটার্ন এমএসিটিভিটি! = নাল && এমএডেড; }
ল্যানিফ

2
@ ব্রোসেলি: addedবুলিয়ান পতাকা এবং বর্তমান Activityউদাহরণটি কিনা তা যাচাই করে null
YS

1
@ গৌরভজাইন সরাসরি টুকরা থেকে অ্যাসিক্রোনাস অনুরোধগুলি (এইচটিটিপি কলগুলির মতো) করা থেকে বিরত থাকুন। ক্রিয়াকলাপ থেকে এটি করুন এবং এটি ঠিক করা উচিত। এছাড়াও, ফ্রেগমেন্ট ম্যানেজারের কাছ থেকে পরিষ্কার টুকরা রেফারেন্স, এটি একটি ভাল অনুশীলন এবং মেমরি ফাঁস এড়ানোর সেরা উপায় to
ওয়াইএস

56

খণ্ডের জীবনচক্রটি অত্যন্ত জটিল এবং বাগগুলি পূর্ণ, যুক্ত করার চেষ্টা করুন:

Activity activity = getActivity(); 
if (isAdded() && activity != null) {
...
}

2
আমার কোথায় রাখা উচিত?
ভ্যাক্লোভাস রেকিয়াস জুনিয়র

1
@ VaclovasRekašiusJr। খণ্ডের অভ্যন্তর থেকে আপনি যে কোনও জায়গায় অ্যাক্টিভিটি অ্যাক্সেস করতে চান তা দেখতে অনেকটা সুন্দর লাগে। মজা!
টাইলারজেমস

2
ক্রিয়াকলাপ == শূন্য হলে আমার কী করা উচিত। আমার আবেদন @Miroslav টিকিয়ে রাখার জন্য
পাভেল

অ্যাডেড () যুক্ত করুন , আপনি দেখতে পেয়েছেন যে "ক্রিয়াকলাপ! = নাল" অপ্রয়োজনীয় নয়
বার্টকিং

@ বার্টকিং return mHost != null && mAdded;- ফ্রেমমেন্ট.আইসকে যুক্ত () পদ্ধতিতে এটিই। আমি ভেবেছিলাম যে mHost একটি ক্রিয়াকলাপ এটি যদি আপনি এটি ট্রেস করেন তবে এটি মনে হয় এম ফ্রেমটি ফ্র্যাগমেন্টএকটিভিটির ভিতরে রয়েছে। সুতরাং, সম্ভবত, আপনি ঠিক। কোন সংযোজন?
জনি পাঁচ

14

আমি পেয়েছি খুব সরল সমাধান আইজড () পদ্ধতি যা এই বর্তমান খণ্ডটি তার ক্রিয়াকলাপের সাথে সংযুক্ত কিনা তা সনাক্ত করার জন্য একটি খণ্ড পদ্ধতির একটি।

আমরা খণ্ড খণ্ডে সর্বত্র এর মতো এটি ব্যবহার করতে পারি:

if(isAdded())
{

// using this method, we can do whatever we want which will prevent   **java.lang.IllegalStateException: Fragment not attached to Activity** exception.

}

12

ব্যতিক্রম: java.lang.IllegalStateException: খণ্ড

ডেডলাইনলিস্টফ্র্যাগমেন্ট {ad2ef970 Ac ক্রিয়াকলাপের সাথে সংযুক্ত নয়

বিভাগ: জীবনচক্র

বিবরণ : ব্যাকগ্রাউন্ড থ্রেডে সময় গ্রহণকারী অপারেশন করার সময় (যেমন, অ্যাসিঙ্কটাস্ক) এর মধ্যে একটি নতুন টুকরা তৈরি করা হয়েছে, এবং ব্যাকগ্রাউন্ড থ্রেড শেষ হওয়ার আগে ক্রিয়াকলাপে আলাদা করা হয়েছিল। ইউআই থ্রেডের কোড (উদাঃপোস্টএক্সেকুট) এমন ব্যতিক্রম ছুঁড়ে একটি বিচ্ছিন্ন অংশকে কল করে।

সমাধান ঠিক করুন:

  1. খণ্ডটি থামানো বা বন্ধ করার সময় পটভূমি থ্রেড বাতিল করুন

  2. এই টুকরাটি সংযুক্ত রয়েছে কিনা তা পরীক্ষা করতে এবং তারপরে ক্রিয়াকলাপ থেকে রিসোর্সেস () পেতে ব্যবহার করুন A


11

আমি দেরিতে হতে পারি তবে কাউকে সাহায্য করতে পারি ..... এর সর্বোত্তম সমাধান হ'ল একটি বিশ্বব্যাপী অ্যাপ্লিকেশন শ্রেণির উদাহরণ তৈরি করা এবং এটি নির্দিষ্ট অংশে কল করা যেখানে আপনার ক্রিয়াকলাপটি সংযুক্ত করা হচ্ছে না where

নীচের মত

icon = MyApplication.getInstance().getString(R.string.weather_thunder);

এখানে অ্যাপ্লিকেশন ক্লাস

public class MyApplication extends Application {

    private static MyApplication mInstance;
    private RequestQueue mRequestQueue;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static synchronized MyApplication getInstance() {
        return mInstance;
    }
}

1
হ্যাঁ, এই পদ্ধতিটিও বহুল ব্যবহৃত হয়।
কুলমাইন্ড

1
এটি বুদ্ধিমান বিকল্প নয়। ফ্রেগমেন্ট কনটেক্সট এবং অ্যাপ্লিকেশনসন্টেক্সটে বিভিন্ন স্টাইল রয়েছে। খণ্ডের প্রসঙ্গে ডার্ক থিম, কাস্টম স্টাইল, লোকেল ইত্যাদি থাকতে পারে। যা বিভিন্ন ফাইল থেকে রঙ, স্ট্রিংয়ের সংস্থান টানবে pull অ্যাপ্লিকেশন কনটেক্সট সঠিক সংস্থান টানতে পারে না। আপনার যদি প্রসঙ্গ না থাকে তবে আপনার সেই উত্সটি রেন্ডার করার চেষ্টা করা উচিত নয়।
জেমশিট ইস্কেন্দ্রভ

2

এই ত্রুটিটি ঘটতে পারে যদি আপনি এমন কোনও খণ্ড ইনস্ট্যান্ট করছেন যা কোনওভাবে ইনস্ট্যান্ট করা যায় না:

Fragment myFragment = MyFragment.NewInstance();


public classs MyFragment extends Fragment {
  public void onCreate() {
   // Some error here, or anywhere inside the class is preventing it from being instantiated
  }
}

আমার ক্ষেত্রে, আমি ব্যবহারের চেষ্টা করার সময় আমি এটি পূরণ করেছি:

private String loading = getString(R.string.loading);

2

খণ্ড ব্যবহার isAdded() মধ্যে খণ্ডটি বর্তমানে ক্রিয়াকলাপের সাথে সংযুক্ত থাকলে এটি সত্য হবে।

আপনি যদি ক্রিয়াকলাপের ভিতরে যাচাই করতে চান

 Fragment fragment = new MyFragment();
   if(fragment.getActivity()!=null)
      { // your code here}
      else{
       //do something
       }

আশা করি এটি কারও সাহায্য করবে


1

আমি এই সমস্যাটি পরিচালনা করার জন্য নিম্নলিখিত পদ্ধতি গ্রহণ করেছি। এমন একটি নতুন শ্রেণি তৈরি করা হয়েছে যা এই জাতীয় কার্যকলাপের পদ্ধতিগুলির জন্য মোড়ক হিসাবে কাজ করে

public class ContextWrapper {
    public static String getString(Activity activity, int resourceId, String defaultValue) {
        if (activity != null) {
            return activity.getString(resourceId);
        } else {
            return defaultValue;
        }
    }

    //similar methods like getDrawable(), getResources() etc

}

এখন যেখানেই আমার টুকরো বা ক্রিয়াকলাপ থেকে সংস্থানগুলি অ্যাক্সেস করতে হবে, সরাসরি পদ্ধতিটি কল করার পরিবর্তে, আমি এই ক্লাসটি ব্যবহার করি। ক্রিয়াকলাপটি contextযদি nullসম্পত্তির মান ফেরত না দেয় এবং ক্ষেত্রে contextশূন্য হয় তবে এটি একটি ডিফল্ট মান পাস করে (যা ফাংশনটির কলকারী দ্বারাও নির্দিষ্ট করা হয়)।

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


0

এটি ঘটে যখন খণ্ডটির কোনও প্রসঙ্গ না থাকে, সুতরাং getActivity () পদ্ধতিটি বাতিল হয়ে যায়। আপনি কনটেক্সট পাওয়ার আগে প্রসঙ্গটি ব্যবহার করেন কিনা তা পরীক্ষা করে দেখুন , বা ক্রিয়াকলাপটি আর নেই if ফ্রেগমেন্ট.অনেক তৈরি করুন এবং এপিআই প্রতিক্রিয়া হওয়ার পরে সাধারণত এই সমস্যাটি প্রসঙ্গটি ব্যবহার করুন


0

কখনও কখনও এই ব্যতিক্রমটি সমর্থন লাইব্রেরি প্রয়োগের ক্ষেত্রে বাগের কারণে ঘটে। এটি থেকে মুক্তি পেতে সম্প্রতি আমাকে 26.1.0 থেকে 25.4.0 এ ডাউনগ্রেড করতে হয়েছিল।


না, আমি না, তবে আমার একটি তৈরি করা উচিত।
Bord81

0

এই সমস্যাটি তখনই ঘটে যখনই আপনি কোনও প্রসঙ্গ কল করেন যা উপলভ্য নয় বা যখন আপনি কল করবেন তখন নালাগুলি। আপনি যখন ব্যাকগ্রাউন্ড থ্রেডে মূল ক্রিয়াকলাপের থ্রেডের প্রসঙ্গ বা মূল ক্রিয়াকলাপের থ্রেডে ব্যাকগ্রাউন্ড থ্রেডের প্রসঙ্গ কল করছেন তখন এটি এমন পরিস্থিতি হতে পারে।

উদাহরণস্বরূপ, আমি নীচের মত আমার ভাগ করা পছন্দসই স্ট্রিং আপডেট করেছি।

editor.putString("penname",penNameEditeText.getText().toString());
editor.commit();
finish();

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

সুতরাং আপনার কোডটি পুনরায় যাচাই করা আছে কিনা তা নিশ্চিত করুন যে এখানে কিছু প্রসঙ্গের সমস্যা রয়েছে কিনা।


আপনি এই সমস্যাটি কীভাবে সমাধান করবেন? আমি এটিকে একটি অ্যাসিঙ্ক থ্রেডের মধ্যে কল করছি এবং আমি এখন এই সমস্যাটি অনুভব করছি।
সাইমন

কেবল লিখিত ক্রিয়াকলাপ শেষ হয়েছে তা নিশ্চিত করুন, তবে কেবল লেখার ক্রিয়াকলাপ শেষ হওয়ার আগেই প্রসঙ্গটি মারা যায় না।
প্রশান্ত পালিওয়াল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.