অ্যাসিঙ্ক কার্যটি শেষ না হওয়া পর্যন্ত অপেক্ষা করা


86

আমি প্রোগ্রামিংয়ে খুব নতুন এবং আমার কিছু সন্দেহ আছে।

আমার কাছে একটি আছে AsyncTaskযা আমি কল করি RunInBackGround

এবং আমি এই প্রক্রিয়াটি শুরু করি:

new RunInBackGround().execute();

তবে কোডের অন্যান্য বিবৃতিতে এগিয়ে যাওয়ার আগে, এই কলটি কার্যকর হওয়া শেষ না হওয়া পর্যন্ত অপেক্ষা করতে চাই।

আমি এটা কিভাবে করবো?

এটির জন্য কোনও উপায় আছে?


4
অ্যাসিঙ্কটাস্কের বিষয়টি হ'ল এটি অ্যাসিনক্রোনাস, যার অর্থ এটি বাকী কোডের সাথে সুসংগত নয়।
Gjordis

4
আপনি আপনার ক্লাসে কলব্যাক পেতে এর অ্যাসিঙ্কটাস্ক পদ্ধতির onPostExecute () ব্যবহার করতে পারেন।
ডকোড শেফ

4
এটি শেষ না হওয়া পর্যন্ত আপনি সত্যিই অপেক্ষা করতে চান না। আপনি যা চান তা শেষ হয় কখন তা জানতে হবে।
njzk2

4
@ ডকোড শেফই একমাত্র তিনি বুঝতে পেরেছিলেন যে প্রশ্নটিতে তিনি কী চেয়েছিলেন।
করে_ডন্ট_বুলি_মে_স_ও_লর্ডস

4
আমি মনে করি এই উত্তর আপনি এ খুঁজছেন হয় stackoverflow.com/questions/13079645/...
user3362415

উত্তর:


131

এই কলটি কার্যকর হওয়া শেষ না হওয়া পর্যন্ত অপেক্ষা করুন

ফলাফল ফিরে পাওয়ার জন্য আপনাকে AsyncTask.get () পদ্ধতিতে কল করতে হবে এবং doInBackgroundকার্যকর হওয়া শেষ না হওয়া পর্যন্ত অপেক্ষা করতে হবে । কিন্তু এটি মেইন UI 'তে থ্রেড যদি আপনি কল একটি থ্রেড ভিতরে পদ্ধতি পেতে বরফে পরিণত করা হবে

ইউআই থ্রেডে ফিরে আসতে ফলাফলটি শুরু করুন AsyncTask:

String str_result= new RunInBackGround().execute().get();

4
তাহলে কীভাবে ফলাফলটির জন্য অপেক্ষা করতে হবে এবং মূল ইউআই থ্রেডটি লক না করা যায় ?! কোডটি ফলাফলের জন্য অপেক্ষা করে বলে তবে মাঝামাঝি সময়ে, প্রগতিবারটি ঘূর্ণায়মান থাকে!
মুহাম্মদ নাদেরি

4
@ মুহাম্মাদনাডেরি: AsyncTaskবিনা getপদ্ধতিতে এবং অ্যাসিঙ্কটাস্ক onPostExecuteপদ্ধতিতে ব্যবহার করা হয় যা মূল ইউআই থ্রেডের ফলাফল দেয়
ρяσѕρєя কে

4
নিশ্চিত এই একটি ওয়ার্কঅ্যারাউন্ড, যা আমি একটি জন্য ব্যবহার করা হয়েছে যখন এখন, কিন্তু কখনও কখনও আমি কিছু asynctask জন্য অপেক্ষা করতে কোডের জন্য প্রয়োজন awaitমধ্যে c#এবং মূল থ্রেড অবশ্যই লক না
মুহাম্মদ Naderi

4
@ ρяσѕρєяK আপনাকে ধন্যবাদ, মিলিয়ন ধন্যবাদ আমি বুঝতে পারি না যে আমি এই সমস্যার উপরে কতটা চুল টেনেছি তবে এটি কেবলমাত্র একটি .get () দিয়ে সমাধান হয়েছে (আপনি আমাকে মজা করছেন) কেবল একটিই .get () !!!!!
Code_Worm 11

আপনি কীভাবে অ্যাসিঙ্কটাস্ক ব্যবহার করতে পারেন এবং ইউআইটিকে হিমাগার থেকে বাঁচতে get () ব্যবহারটি এড়াতে পারেন?
অর্জুন ইসার

37

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

আপনার কাছে এখানে বেশ কয়েকটি বিকল্প রয়েছে;

  1. আপনি যে কোডটি অপেক্ষা করতে চান সেটি অ্যাসিঙ্কটাস্কেই কার্যকর করতে পারেন। এটির যদি ইউআই (থ্রেড) আপডেট করার সাথে করতে হয় তবে আপনি অনপস্টএক্সেকিউট পদ্ধতিটি ব্যবহার করতে পারেন। আপনার পটভূমির কাজটি শেষ হয়ে গেলে এটি স্বয়ংক্রিয়ভাবে বলা হয়ে থাকে।

  2. আপনি যদি কোনও কারণে কার্যকলাপ / খণ্ড / যে কোনও ক্ষেত্রে এটি করতে বাধ্য হন তবে আপনি নিজের কাস্টম শ্রোতাও তৈরি করতে পারেন, যা আপনি আপনার অ্যাসিঙ্কটাস্ক থেকে সম্প্রচারিত করেছেন। এটি ব্যবহার করে আপনার ক্রিয়াকলাপ / খণ্ড / আপনি যা চান কেবল তখনই কলব্যাক পদ্ধতিতে কলব্যাক পদ্ধতি থাকতে পারে: যখন আপনার অ্যাসিঙ্কটাস্কটি আপনাকে অপেক্ষা করতে হয়েছিল তখন এটি সম্পন্ন হয়।


6
এটি একটি ভয়ঙ্কর উত্তর, এটি গ্রহণযোগ্য হওয়া উচিত। : এছাড়াও এখানে কিভাবে AsyncTasks সঙ্গে এই অর্জন করার একটি নমুনা stackoverflow.com/questions/12575068/...
জোসে গঞ্জালেস

আপনার দ্বিতীয় বিকল্পটিতে, আপনি যখন আপনার রিসিভারের দিকে লক্ষ্য রেখেছিলেন তখন মূল থ্রেডটি আবার শুরু হবে। ওপি এর দরকার নেই।
লিনসিটোনিটা

16

আপনার AsyncTaskযোগে একটি অগ্রগতি ডায়ালগের মতো:

private final ProgressDialog dialog = new ProgressDialog(YourActivity.this);

আপনি onPreExecute()পদ্ধতিতে যেমন সেট সেট করতে পারেন :

this.dialog.setMessage("Processing..."); 
this.dialog.show();

এবং আপনার onPostExecute(Void result)পদ্ধতিতে আপনার বরখাস্ত ProgressDialog


15

অ্যাসিঙ্কটাস্কের চারটি পদ্ধতি রয়েছে ..

onPreExecute  -- for doing something before calling background task in Async

doInBackground  -- operation/Task to do in Background

onProgressUpdate  -- it is for progress Update

onPostExecute  -- this method calls after asyncTask return from doInBackground.

onPostExecute()থেকে ফিরে আসার পরে আপনি এতে আপনার কাজের কল করতে পারেনdoInBackground()

onPostExecute হ'ল আপনাকে কার্যকর করতে হবে।


1

আমি মনে করি সবচেয়ে সহজ উপায় হ'ল অনপস্টেকেক্সেকট থেকে ডেটা পাওয়ার জন্য একটি ইন্টারফেস তৈরি করা এবং ইন্টারফেস থেকে ইউআই চালানো:

একটি ইন্টারফেস তৈরি করুন:

public interface AsyncResponse {
    void processFinish(String output);
}

তারপরে অ্যাসিঙ্কটাস্কে

@Override
protected void onPostExecute(String data) {
    delegate.processFinish(data);
}

তারপরে আপনার মূল ক্রিয়াকলাপে

@Override
public void processFinish(String data) {
     // do things

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