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




android-fragments android-activity (8)

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

java.lang.IllegalStateException: Fragment  not attached to Activity

আমি বর্তমানে isAdded() পদ্ধতিতে কোডটি ভিতরে যুক্ত করার চেষ্টা করেছি যাতে খণ্ডটি বর্তমানে তার ক্রিয়াকলাপে যুক্ত হয়েছে কিনা তা যাচাই করার জন্য তবে আমি খুব কমই এই ত্রুটিটি 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();
                        }
                    }
                });

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

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 হয় না তবে এটি সম্পত্তির মান প্রদান করে এবং context শূন্য হলে এটি একটি ডিফল্ট মান (যা ফাংশনের আহ্বায়ক দ্বারা নির্দিষ্ট করা হয়) পাস করে।

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


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

নীচের মত

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

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

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

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

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

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

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

    // etc ...

}

এবং এছাড়াও, onError() পদ্ধতিতে 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();
        }
    }
}

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


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


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

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

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

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


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

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

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

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

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

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

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





illegalstateexception