147 votes

runOnUiThread du fragment

Je suis en train de convertir une Activité de fragment. L'erreur sur runOnUiThread. sur le passé:

GoogleActivityV2 s'étend de l'Activité. runOnUiThread dans la classe ExecuteTask. classe ExecuteTask imbriquées sur l'activité.

(Run ok) maintenant :

GoogleActivityV2 s'étend à partir de Fragment. runOnUiThread dans la classe ExecuteTask. classe ExecuteTask imbriquées sur l'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 corriger cette erreur?

315voto

bclymer Points 1867

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

C'est parce que:

1) l'implicite this à votre appel à l' runOnUiThread est en se référant à AsyncTask, pas votre fragment.

2) Fragment n'ont pas runOnUiThread

(http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/app/Fragment.java?av=f)

toutefois Activity n'est:

(http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.2_r1/android/app/Activity.java?av=f)

Notez que cela ne fera qu'exécuter l' Runnable si vous êtes déjà sur le thread principal, et utilise un Handler si vous n'êtes pas sur le thread principal. Vous pouvez mettre en œuvre un Handler dans votre fragment si vous ne voulez pas à vous soucier du contexte de l' this, c'est vraiment très facile:

http://developer.android.com/reference/android/os/Handler.html

EDIT: @rciovati est de droite, vous êtes en onPostExecute, qui est déjà sur le thread principal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X