খণ্ডে রানঅনুআইথ্রেড


121

আমি একটি ক্রিয়াকলাপকে খণ্ডে রূপান্তরিত করার চেষ্টা করছি। ত্রুটি চিহ্ন চালু runOnUiThread। অতীতে:

GoogleActivityV2 ক্রিয়াকলাপ থেকে প্রসারিত extend এক্সিকিউটটাস্ক ক্লাসে রানঅনুআইথ্রেড। ক্লাস এক্সিকিউটিটাস্ক ক্রিয়াকলাপে নেস্ট করেছে।

(ঠিক আছে চালান) এখন:

গুগলঅ্যাক্টিভিটিভি 2 ফ্র্যাগমেন্ট থেকে প্রসারিত। এক্সিকিউটটাস্ক ক্লাসে রানঅনুআইথ্রেড। ক্লাস এক্সিকিউটিটাস্ক ক্রিয়াকলাপে নেস্ট করেছে। (রানঅনউইথ্রেডে ত্রুটি)

এখানে আমার কোড

public class GoogleActivityV2 extends SherlockMapFragment implements OnMapClickListener , OnMapLongClickListener , OnCameraChangeListener , TextWatcher {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View rootView = inflater.inflate(R.layout.activity_googlev2, container, false);
        Init();
        adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_dropdown_item_1line);
        textView = (AutoCompleteTextView) getView().findViewById(R.id.autoCompleteTextView1);
        return rootView;
    }

    public void onCameraChange(CameraPosition arg0){
        // TODO Auto-generated method stub
    }

    public void onMapLongClick(LatLng arg0){
        llLoc = arg0;
        stCommand = "onTouchEvent";
        lp = new ExecuteTask();
        lp.execute();
    }

    public void onMapClick(LatLng arg0){
        // TODO Auto-generated method stub
    }

    class ExecuteTask extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute(){
            super.onPreExecute();
            if(stCommand.compareTo("AutoCompleteTextView") != 0) {
                pDialog = new ProgressDialog(getActivity());
                pDialog.setMessage(Html.fromHtml("<b>Search</b><br/>Loading ..."));
                pDialog.setIndeterminate(false);
                pDialog.setCancelable(false);
                pDialog.show();
            }
        }

        protected String doInBackground(String ... args){
            do something
            return null;
        }

        @Override
        protected void onPostExecute(String file_url){
            if(stCommand.compareTo("AutoCompleteTextView") != 0) pDialog.dismiss();
            runOnUiThread(new Runnable() {
                public void run(){
                    do something
                }
            });
        }
    }
    public void afterTextChanged(Editable s){
        // TODO Auto-generated method stub
    }

    public void beforeTextChanged(CharSequence s, int start, int count, int after){
        // TODO Auto-generated method stub
    }

    public void onTextChanged(CharSequence s, int start, int before, int count){
        // TODO Auto-generated method stub
    }
}

ত্রুটি বলে: গ্রহণের ত্রুটি

আমি কীভাবে এই ত্রুটিটি ঠিক করতে পারি?


8
পোস্টপেক্সেকিউটের ভিতরে আপনি যে কোডটি লিখেছেন সেটি ইতিমধ্যে মূল থ্রেডের অভ্যন্তরে চলছে। অন্যদিকে, আপনার রানঅনউইথ্রেড () চালানের দরকার নেই।
rciovati

পোষ্টএক্সেকিউট-এ ও বাইরে আউটআরসিওবাতি "কিছু করুন"
তাই দাও

উত্তর:


271

এটা চেষ্টা কর: getActivity().runOnUiThread(new Runnable...

ইহার কারণ:

1) thisআপনার কলটিতে অন্তর্ভুক্তটি আপনার runOnUiThreadখণ্ডকে নয়, অ্যাসিঙ্কটাস্ককে উল্লেখ করছে।

2) Fragmentরানঅনউইথ্রেড নেই।

যাইহোক, Activityনা।

মনে রাখবেন যে আপনি ইতিমধ্যে মূল থ্রেডে থাকলে Activityকেবলমাত্র এটি সম্পাদন করে Runnable, অন্যথায় এটি ব্যবহার করে a HandlerআপনিHandler যদি এর প্রসঙ্গে উদ্বিগ্ন হতে না চান তবে আপনার খণ্ডগুলিতে এটি বাস্তবায়ন করতে পারেন this, এটি আসলে খুব সহজ:

// A class instance
private Handler mHandler = new Handler(Looper.getMainLooper());

// anywhere else in your code
mHandler.post(<your runnable>);
// ^ this will always be run on the next run loop on the main thread.

সম্পাদনা: @ আরসিওবাতি ঠিক আছে, আপনি onPostExecuteইতিমধ্যে আছেন, এটি ইতিমধ্যে মূল থ্রেডে রয়েছে।


3
কিছু সময় getActivity ()। রানঅনউইথ্রেড নালপয়েন্টারএক্সসেপশন হিসাবে ফলস্বরূপ। আপনি ব্যাখ্যা করতে পারেন?
বিকাশকারী

1
@ বিকাশকারী ১১১১ যা খণ্ডটি ক্রিয়াকলাপ থেকে বিচ্ছিন্ন হয়ে গেলে ঘটবে। এটি অ্যাসিঙ্ক কার্যগুলিতে সাধারণ, কারণ ক্রিয়াকলাপটি দীর্ঘকাল চলমান অপারেশনের সময় ধ্বংস করা যেতে পারে, সুতরাং এটি আর নেই get। সর্বদা শূন্যের জন্য প্রথমে পরীক্ষা করুন।
স্লাইডার

4
ধন্যবাদ। আমি বেষ্টিত getActivity().runOnUiThreadসঙ্গে if (isAdded())এবং এটি কাজ করে জরিমানা
developer1011

1
@ বিস্লাইমার এই উত্তরটি দিয়েছেন, গুগলের টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো জন্য ইউআই থ্রেড, শেষ বিভাগে আরও কিছু বিশদ (একইভাবে কাজ সম্পন্ন হ্যান্ডলারের বাস্তবায়ন কীভাবে) চমৎকার হবে!
LS97

4

Xamarin.Android এ

খণ্ডের জন্য:

this.Activity.RunOnUiThread(() => { yourtextbox.Text="Hello"; });

ক্রিয়াকলাপের জন্য:

RunOnUiThread(() => { yourtextbox.Text="Hello"; });

শুভ কোডিং :-)


4

একটি কোটলিন এক্সটেনশন ফাংশন ব্যবহার করুন

fun Fragment?.runOnUiThread(action: () -> Unit) {
    this ?: return
    if (!isAdded) return // Fragment not attached to an Activity
    activity?.runOnUiThread(action)
}

তারপরে, যে কোনওটিতে Fragmentআপনি কেবল কল করতে পারেন runOnUiThread। এটি ক্রিয়াকলাপ এবং টুকরোগুলি জুড়ে ধারাবাহিক রাখে।

runOnUiThread {
    // Call your code here
}

দ্রষ্টব্য : যদি Fragmentআর কোনওটির সাথে সংযুক্ত না থাকে Activity, কলব্যাক কল করা হবে না এবং কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হবে না

আপনি যদি এই স্টাইলটি যে কোনও জায়গা থেকে অ্যাক্সেস করতে চান তবে আপনি একটি সাধারণ অবজেক্ট যুক্ত করতে পারেন এবং পদ্ধতিটি আমদানি করতে পারেন:

object ThreadUtil {
    private val handler = Handler(Looper.getMainLooper())

    fun runOnUiThread(action: () -> Unit) {
        if (Looper.myLooper() != Looper.getMainLooper()) {
            handler.post(action)
        } else {
            action.invoke()
        }
    }
}

1
আমি একেবারে কোটলিন এক্সটেনশন ফাংশন পছন্দ করি।
ওহহহাটহাট ভারুন

2

আমি এটি একটি খণ্ডে তারিখ এবং সময় পাওয়ার জন্য ব্যবহার করেছি।

private Handler mHandler = new Handler(Looper.getMainLooper());
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    // Inflate the layout for this fragment
    View root = inflater.inflate(R.layout.fragment_head_screen, container, false);

    dateTextView =  root.findViewById(R.id.dateView);
    hourTv = root.findViewById(R.id.hourView);

        Thread thread = new Thread() {
        @Override
        public void run() {
            try {
                while (!isInterrupted()) {
                    Thread.sleep(1000);
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            //Calendario para obtener fecha & hora
                            Date currentTime = Calendar.getInstance().getTime();
                            SimpleDateFormat date_sdf = new SimpleDateFormat("dd/MM/yyyy");
                            SimpleDateFormat hour_sdf = new SimpleDateFormat("HH:mm a");

                            String currentDate = date_sdf.format(currentTime);
                            String currentHour = hour_sdf.format(currentTime);

                            dateTextView.setText(currentDate);
                            hourTv.setText(currentHour);
                        }
                    });
                }
            } catch (InterruptedException e) {
                Log.v("InterruptedException", e.getMessage());
            }
        }
    };
}

1

আপনি অন্য কোনও থ্রেড থেকে ভিউ ব্যবহার করে রানওনযোগ্য পোস্ট করতে পারেন। তবে নিশ্চিত হন যে ভিউটি নাল নয়:

 tView.post(new Runnable() {
                    @Override
                    public void run() {
                        tView.setText("Success");
                    }
                });

ডকুমেন্টেশন অনুযায়ী:

"বুলিয়ান পোস্ট (চলমান অ্যাকশন) রান্নেবলকে বার্তা কাতারে যুক্ত করার কারণ ঘটায় user

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