Я пытаюсь преобразовать действие во фрагмент. Знак ошибки включен runOnUiThread
. о прошлом:
GoogleActivityV2 расширяется от Activity. runOnUiThread в классе ExecuteTask. класс ExecuteTask, вложенный в действие.
(Беги нормально) сейчас:
GoogleActivityV2 расширяется от Fragment. 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
}
}
ошибка говорит:
как я могу исправить эту ошибку?
Ответы:
Попробуй это:
getActivity().runOnUiThread(new Runnable...
Это потому что:
1) неявное
this
в вашем вызовеrunOnUiThread
относится к AsyncTask, а не к вашему фрагменту.2)
Fragment
не имеет runOnUiThread.Однако
Activity
делает.Обратите внимание, что
Activity
просто выполняет,Runnable
если вы уже находитесь в основном потоке, в противном случае он используетHandler
. Вы можете реализовать aHandler
в своем фрагменте, если не хотите беспокоиться о контекстеthis
, на самом деле это очень просто:РЕДАКТИРОВАТЬ: @rciovati прав, вы в
onPostExecute
, это уже в основном потоке.источник
get
. Всегда сначала проверяйте наличие null.getActivity().runOnUiThread
сif (isAdded())
и работает отличноВ Xamarin.Android
Для фрагмента:
Для деятельности:
Удачного кодирования :-)
источник
Используйте функцию расширения Kotlin
Тогда в любой
Fragment
можно просто позвонитьrunOnUiThread
. Это обеспечивает единообразие вызовов для разных действий и фрагментов.Если вы хотите получить доступ к этому стилю из любого места, вы можете добавить общий объект и импортировать метод:
источник
Я использовал это для получения даты и времени во фрагменте.
источник
Вы также можете опубликовать runnable, используя представление из любого другого потока. Но убедитесь, что представление не нулевое:
Согласно документации:
"boolean post (Runnable action) Заставляет Runnable быть добавленным в очередь сообщений. Runnable будет запущен в потоке пользовательского интерфейса."
источник