web-dev-qa-db-fra.com

runOnUiThread en fragment

J'essaie de convertir une activité en fragment. La marque d'erreur sur runOnUiThread. Sur le passé:

GoogleActivityV2 s'étend de Activity. runOnUiThread dans la classe ExecuteTask. La classe ExecuteTask est imbriquée en activité.

(Run ok) maintenant:

GoogleActivityV2 s'étend de Fragment. runOnUiThread dans la classe ExecuteTask. La classe ExecuteTask est imbriquée en activité. (Erreur sur runOnUiThread)

voici mon code

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

l'erreur dit: Eclipse Error

comment puis-je réparer cette erreur?

103
Tai Dao

Essayez ceci: getActivity().runOnUiThread(new Runnable...

C'est parce que:

1) le this implicite dans votre appel à runOnUiThread fait référence à AsyncTask, pas à votre fragment.

2) Fragment n'a pas runOnUiThread.

Cependant, Activity le fait.

Notez que Activity exécute simplement Runnable si vous êtes déjà sur le thread principal, sinon il utilise un Handler. Vous pouvez implémenter un Handler dans votre fragment si vous ne voulez pas vous soucier du contexte de this, c'est en fait très simple:

// 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.

EDIT: @rciovati a raison, vous êtes dans onPostExecute, c'est déjà sur le fil principal.

237
bclymer

Dans Xamarin.Android

Pour le fragment:

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

Pour l'activité:

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

Bonne codage :-)

2
Ripdaman Singh

J'ai utilisé cela pour obtenir la date et l'heure dans un fragment.

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());
            }
        }
    };
}
0
Irving Kennedy