Подтвердить что ты не робот

RunOnUiThread в фрагменте

Я пытаюсь преобразовать операцию в фрагмент. Знак ошибки на runOnUiThread. в прошлом:

GoogleActivityV2 распространяется из Activity. runOnUiThread в классе ExecuteTask. класс ExecuteTask, вложенный в действие.

(Запустите ok) сейчас:

GoogleActivityV2 распространяется от фрагмента. runOnUiThread в классе ExecuteTask. класс ExecuteTask вложен в активность. (Ошибка при runOnUiThread)

вот мой код

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

ошибка говорит: Eclipse Error

как я могу исправить эту ошибку?

4b9b3361

Ответ 1

Попробуйте следующее: getActivity().runOnUiThread(new Runnable...

Это потому, что:

1) неявный this в вашем вызове runOnUiThread ссылается на AsyncTask, а не на ваш фрагмент.

2) Fragment не имеет runOnUiThread

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

однако Activity делает:

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

Обратите внимание, что это просто выполняется Runnable, если вы уже находитесь в основном потоке, и использует Handler, если вы не находитесь в основном потоке. Вы можете реализовать Handler в своем фрагменте, если вы не хотите беспокоиться о контексте this, это действительно очень просто:

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

EDIT: @rciovati прав, вы находитесь в onPostExecute, что уже в основном потоке.