অ্যাসিঙ্কটাস্কে প্রসঙ্গ পাওয়া যাচ্ছে


83

আমি আমার ক্লাসের অসিঙ্কটাস্ককে ওপসিওনেস বলে প্রসঙ্গটি পাওয়ার চেষ্টা করছি (এই ক্লাসটি কেবল সেই কাজটিকে ডাকে) তবে কীভাবে এটি করতে হয় তা আমি জানি না, আমি এর মতো কিছু কোড দেখেছি:

      protected void onPostExecute(Long result) {

    Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
}

তবে এটি আমার পক্ষে কাজ করে না এটি বলে: "No enclosing instance of the type Opciones in scope"


4
Opciones একটি কার্যকলাপ হয়? যদি তা না হয় তবে আপনাকে সেই শ্রেণিতে একটি প্রসঙ্গ পাস করতে হবে এবং তারপরে এটি ব্যবহার করতে হবেAsyncTask
টোরবেন কোহলমিয়ার

এটি দেখতে একটি উত্তরের মতো দেখতে স্ট্যাকওভারফ্লো.com
মঙ্গেশ

উত্তর:


176

আপনার নিম্নলিখিত বিষয়গুলি করা দরকার।

  • আপনি যখন অ্যাসিঙ্কটাস্ক ব্যবহার করতে চান, তখন অন্য শ্রেণিতে মাইকাস্টম টাস্কটি প্রসারিত করুন ।
  • নতুন ক্লাসের কনস্ট্রাক্টারে কনটেক্সট পাস করুন

উদাহরণ

public class MyCustomTask extends AsyncTask<Void, Void, Long> {

    private Context mContext;

    public MyCustomTask (Context context){
         mContext = context;
    }

    //other methods like onPreExecute etc.
    protected void onPostExecute(Long result) {
         Toast.makeText(mContext,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
    }
}

এবং অনুসরণ করে ক্লাস ইনস্ট্যান্ট করুন।

MyCustomTask task = new MyCustomTask(context);
task.execute(..);

36
নোট করুন যে অ-নেস্টেড বা স্ট্যাটিক ক্লাস ব্যবহার করা এবং মেমরির ফাঁস এড়াতে দুর্বল রেফারেন্সে এমকন্টেক্সট রাখা অনেক ভাল হবে
বামসাম্যাক্স

8
নেস্টেড স্ট্যাটিক ক্লাসে হোল্ডিং প্রসঙ্গে থ্রো মেমরি ফাঁসের সতর্কতা
আমির হোসেইন ঘাসেমি

4
এবং নেস্টেড-ক্লাসে অ স্ট্যাটিক ক্লাস ধরে রাখার ফলে পুরো ক্লাসের মেমরি ফাঁস হওয়ার সতর্কতা হয়! সুতরাং মেমরি ফাঁস ছাড়া আমাদের কী প্রসঙ্গে ব্যবহার করা উচিত !?
আমির হোসাইন ঘাসেমি

4
মেমরি ফাঁস সমাধানের জন্য কোনও উপায় সন্ধান করুন, প্রসঙ্গটি WeakReferences শ্রেণি হওয়া উচিত।
আমির হোসেইন ঘাসেমি

এটি নেস্টেট স্ট্যাটিক ক্লাস করা হবে না। এর সর্বজনীন শ্রেণি এবং ক্রিয়াকলাপ পৃথকভাবে সংজ্ঞায়িত করা দরকার। তবে হ্যাঁ, নিরাপদ পক্ষে আমরা WeakReferences ব্যবহার করতে পারি।
চিন্তন রাঠোদ

59

হোস্ট ক্রিয়াকলাপের একটি দুর্বল রেফারেন্স রাখা স্মৃতিশক্তি ফাঁস রোধ করবে।

static class MyTask extends AsyncTask<Void, Void, Void> {
    // Weak references will still allow the Activity to be garbage-collected
    private final WeakReference<Activity> weakActivity;

    MyTask(Activity myActivity) {
      this.weakActivity = new WeakReference<>(myActivity);
    }

    @Override
    public Void doInBackground(Void... params) {
      // do async stuff here
    }

    @Override
    public void onPostExecute(Void result) {
      // Re-acquire a strong reference to the activity, and verify
      // that it still exists and is active.
      Activity activity = weakActivity.get();
      if (activity == null
          || activity.isFinishing()
          || activity.isDestroyed()) {
        // activity is no longer valid, don't do anything!
        return;
      }

      // The activity is still valid, do main-thread stuff here
    }
  }

4
যখন আমরা ক্রিয়াকলাপগুলির মধ্যে পরিবর্তন (অ্যাসিনটাস্ক বন্ধ এবং পুনরায় শুরু করা) এবং তারপরে ফিরে আসি তখন কী, দুর্বলতাটি এখনও সক্রিয়?
D4rWiNS

4
ক্লাসের প্রতি আমার অ্যাক্টিভিটি পাশ করার পরিবর্তে দুর্বল রেফারেন্সটি পাস করার সুবিধা কী?
স্টিলনেস খুঁজছেন

4
@ সেকিং স্টিলনেস দুর্বল উল্লেখগুলি এখনও ক্রিয়াকলাপটিকে আবর্জনা সংগ্রহের অনুমতি দেয় যাতে মেমরি ফুটো আটকাতে পারে।
সাঁই

13

যেহেতু শুধুমাত্র একজনই Activityএই টাস্কটি ব্যবহার করে তাই কেবল এটির একটি অভ্যন্তর শ্রেণি তৈরি করুনActivity

public class Opciones extends Activity
{
     public void onCreate()
     {
         ...
     }

    public class MyTask extends AsyncTask<>
    {
        ...

         protected void onPostExecute(Long result) {
        Toast.makeText(Opciones.this,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
     }
}

তারপরে আপনার এর Activityএবং এর এর সদস্য ভেরিয়েবলগুলিতে অ্যাক্সেস রয়েছেContext


4
অ্যাসিঙ্কটাস্ক ক্লাস স্থির না হলে লিন্ট মেমরি ফাঁস সম্পর্কে একটি সতর্কতা দেখায়।
সাপুসিভেন

@ সাপুসিভেন মনে রাখবেন এটি কেবল একটি সতর্কতা । আমি ব্যক্তিগতভাবে মনে করি না যে এটি AsyncTaskস্বল্পস্থায়ী ক্রিয়াকলাপের জন্য এবং প্রায়শই একটি ভিউতে আপডেট করার ক্ষেত্রে সঠিকভাবে ব্যবহার করা হলে এটি একটি সমস্যা হওয়া উচিত ActivityonPause()যদি তারা এখনও চলমান থাকে তবে এগুলিকে বাতিল করা প্রায়শই ভাল ধারণা । হতে পারে আমি ভুল কিন্তু এগুলি সম্পর্কে সর্বদা আমার ধারণা ছিল। এখানে এই বিষয়টিতে আরও কিছু পাঠ করা হচ্ছে
কোডম্যাগিক

-6

আপনি লিখতে পারেন getApplicationContex()। অথবা গ্লোবাল ভেরিয়েবলের সংজ্ঞা দিন।

Activity activity;

এবং onCreate()অনুষ্ঠানে

activity = this;

তারপর,

 protected void onPostExecute(Long result) {

    Toast.makeText(activity,"Subiendo la foto. ¡Tras ser moderada empezara a ser votada!: ", Toast.LENGTH_LONG).show(); 
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.