Android AsyncTask API এন্ড্রয়েড ১১. অবমূল্যায়ন 11 বিকল্পগুলি কী?


20

সম্পাদনা : এই প্রশ্নটি সদৃশ নয়

  1. দু'দিন আগেই এওএসপি অবমূল্যায়নের প্রতিশ্রুতিবদ্ধ হয়েছিল।
  2. অন্য প্রশ্নটি AsyncTaskLoader AsyncTask এর মাধ্যমে ব্যবহার সম্পর্কে।


গুগল অ্যান্ড্রয়েড 11 এ অ্যান্ড্রয়েড অ্যাসিঙ্কটাস্ক এপিআই-কে হ্রাস করছে এবং তার java.util.concurrentপরিবর্তে ব্যবহারের পরামর্শ দিচ্ছে । আপনি এখানে প্রতিশ্রুতি পরীক্ষা করতে পারেন

 *
 * @deprecated Use the standard <code>java.util.concurrent</code> or
 *   <a href="https://developer.android.com/topic/libraries/architecture/coroutines">
 *   Kotlin concurrency utilities</a> instead.
 */
@Deprecated
public abstract class AsyncTask<Params, Progress, Result> {

যদি আপনি অ্যান্ড্রয়েডে অ্যাসিঙ্ক্রোনাস টাস্ক সহ কোনও পুরানো কোডবেস বজায় রাখছেন তবে ভবিষ্যতে আপনাকে সম্ভবত এটি পরিবর্তন করতে হবে। আমার প্রশ্নটি হ'ল নীচে ব্যবহার করে দেখানো কোড স্নিপেটের যথাযথ প্রতিস্থাপন কী হওয়া উচিত java.util.concurrent। এটি একটি ক্রিয়াকলাপের একটি স্থিতিশীল অভ্যন্তর শ্রেণি। আমি এমন কিছু খুঁজছি যা নিয়ে কাজ করবেminSdkVersion 16

private static class LongRunningTask extends AsyncTask<String, Void, MyPojo> {
        private static final String TAG = MyActivity.LongRunningTask.class.getSimpleName();
        private WeakReference<MyActivity> activityReference;

        LongRunningTask(MyActivity context) {
            activityReference = new WeakReference<>(context);
        }

        @Override
        protected MyPojo doInBackground(String... params) {
            // Some long running task

        }

        @Override
        protected void onPostExecute(MyPojo data) {

            MyActivity activity = activityReference.get();
            activity.progressBar.setVisibility(View.GONE);
            populateData(activity, data) ;
        }     


    }

5
"অসমাপ্ত" এর অর্থ হ'ল গুগল আপনাকে অন্য কোনও জায়গায় যাওয়ার পরামর্শ দিচ্ছে। এর অর্থ এই নয় যে খুব শীঘ্রই ক্লাসটি সরানো হবে। বিশেষত, AsyncTaskপিছনের সামঞ্জস্যতা না ভেঙে সরানো যায় না।
কমন্সওয়্যার


2
@ স্টাইল -7 এটি নয়।
এপিকপান্ডাফোরস

"স্ট্যাটিক ইনার ক্লাস" বলে কিছু নেই। আপনি একটি স্থির নেস্টেড বর্গ বোঝাতে চাইছেন।
বেরোয়াল

উত্তর:


22
private WeakReference<MyActivity> activityReference;

ভাল বিড়ম্বনা যে এটি অবহেলা করা হয়েছে, কারণ এটি WeakReference<Context>সর্বদা একটি হ্যাক ছিল এবং সঠিক সমাধান ছিল না

এখন লোকেরা তাদের কোড স্যানিটাইজ করার সুযোগ পাবে।


AsyncTask<String, Void, MyPojo> 

এই কোডের ভিত্তিতে, Progressআসলে প্রয়োজন হয় না এবং একটি Stringইনপুট + MyPojoআউটপুট থাকে।

অ্যাসিঙ্কটাস্কের কোনও ব্যবহার ছাড়াই এটি সম্পাদন করা বেশ সহজ।

public class TaskRunner {
    private final Executor executor = Executors.newSingleThreadExecutor(); // change according to your requirements
    private final Handler handler = new Handler(Looper.getMainLooper());

    public interface Callback<R> {
        void onComplete(R result);
    }

    public <R> void executeAsync(Callable<R> callable, Callback<R> callback) {
        executor.execute(() -> {
            final R result = callable.call();
            handler.post(() -> {
                callback.onComplete(result);
            });
        });
    }
}

স্ট্রিংয়ে কিভাবে পাস করবেন? তাই ভালো:

class LongRunningTask implements Callable<MyPojo> {
    private final String input;

    public LongRunningTask(String input) {
        this.input = input;
    }

    @Override
    public MyPojo call() {
        // Some long running task
        return myPojo;
    }
}

এবং

// in ViewModel
taskRunner.executeAsync(new LongRunningTask(input), (data) -> {
    // MyActivity activity = activityReference.get();
    // activity.progressBar.setVisibility(View.GONE);
    // populateData(activity, data) ;

    loadingLiveData.setValue(false);
    dataLiveData.setValue(data);
});

// in Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main_activity);

    viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
    viewModel.loadingLiveData.observe(this, (loading) -> {
        if(loading) {
            progressBar.setVisibility(View.VISIBLE);
        } else {
            progressBar.setVisibility(View.GONE);
        }
    });

    viewModel.dataLiveData.observe(this, (data) -> {
        populateData(data);
    }); 
}

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

private static final Executor THREAD_POOL_EXECUTOR =
        new ThreadPoolExecutor(5, 128, 1,
                TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());

আমি একটি ত্রুটি পেয়ে যাচ্ছি executor.post। পদ্ধতিটি সমাধান করতে পারে না
ক্রিস বি

@ ক্রিসবি স্পষ্টতই এর execute()পরিবর্তে ডাকা হয়েছেpost()
এপিকপান্ডাফোরস

আপনি কি জানেন যে এটির Contextমধ্যে একটি পাস করা ঠিক আছে কিনা ? আমি জানি যে একটি ক্ষণস্থায়ী Contextমধ্যে AsyncTaskএটা বিষয় ছিল।
ক্রিস বি

আপনার এখনও এটিকে ভিউমোডেল, রক্ষিত টুকরা, সিঙ্গলটন বা অন্য যে কোনও কিছুতে চালানো দরকার যেমন আপনি সাধারণত অ্যান্ড্রয়েডে অ্যাসিঙ্কের সাথে করেন anything
এপিকপান্ডাফোর্স

1
newSingleThreadExecutorলেখকদের জন্য ভাল, তবে আপনার অবশ্যই THREAD_POOL_EXECUTORডেটাবেস রিডের জন্য পোস্টের শেষে ব্যবহার করা উচিত ।
এপিকপান্ডাফোরস

3

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

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