Próbuję przekonwertować działanie na fragment. Znak błędu włączony runOnUiThread
. w przeszłości:
GoogleActivityV2 rozciąga się od Activity. runOnUiThread w klasie ExecuteTask. klasa ExecuteTask zagnieżdżona w działaniu.
(Uruchom ok) teraz:
GoogleActivityV2 rozciąga się od Fragment. runOnUiThread w klasie ExecuteTask. klasa ExecuteTask zagnieżdżona w działaniu. (Błąd w runOnUiThread)
oto mój kod
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
}
}
błąd mówi:
jak mogę naprawić ten błąd?
Odpowiedzi:
Spróbuj tego:
getActivity().runOnUiThread(new Runnable...
To dlatego, że:
1) ukryty
this
w wywołaniu dorunOnUiThread
odnosi się do AsyncTask, a nie do Twojego fragmentu.2)
Fragment
nie ma runOnUiThread.Jednak
Activity
tak.Zauważ, że
Activity
po prostu wykonuje,Runnable
jeśli jesteś już w głównym wątku, w przeciwnym razie używa plikuHandler
. Możesz zaimplementować aHandler
w swoim fragmencie, jeśli nie chcesz martwić się o kontekstthis
, w rzeczywistości jest to bardzo łatwe:EDYCJA: @rciovati ma rację, jesteś w
onPostExecute
, to już jest w głównym wątku.źródło
get
. Zawsze najpierw sprawdź, czy nie ma wartości null.getActivity().runOnUiThread
sięif (isAdded())
i działa dobrzeW Xamarin.Android
Dla fragmentu:
Do aktywności:
Miłego kodowania :-)
źródło
Użyj funkcji rozszerzenia Kotlin
Następnie
Fragment
możesz po prostu zadzwonićrunOnUiThread
. Dzięki temu połączenia są spójne we wszystkich działaniach i fragmentach.Jeśli chcesz uzyskać dostęp do tego stylu z dowolnego miejsca, możesz dodać wspólny obiekt i zaimportować metodę:
źródło
Użyłem tego do pobrania daty i godziny we fragmencie.
źródło
Możesz także publikować, korzystając z widoku z dowolnego innego wątku. Ale upewnij się, że widok nie jest zerowy:
Zgodnie z dokumentacją:
„Post boolean (akcja Runnable) Powoduje dodanie Runnable do kolejki komunikatów. Runnable zostanie uruchomiona w wątku interfejsu użytkownika.”
źródło