Ich versuche, eine Aktivität in ein Fragment umzuwandeln. Die Fehlermarkierung auf runOnUiThread
. auf die Vergangenheit:
GoogleActivityV2 erstreckt sich von Aktivität. runOnUiThread in der Klasse ExecuteTask. Klasse ExecuteTask in Aktivität verschachtelt.
(Ok laufen) jetzt:
GoogleActivityV2 erstreckt sich von Fragment. runOnUiThread in der Klasse ExecuteTask. Klasse ExecuteTask in Aktivität verschachtelt. (Fehler bei runOnUiThread)
Hier ist mein 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
}
}
Der Fehler lautet:
Wie kann ich diesen Fehler beheben?
Antworten:
Versuche dies:
getActivity().runOnUiThread(new Runnable...
Es ist, weil:
1) Der implizite
this
Aufruf Ihres AufrufsrunOnUiThread
bezieht sich auf AsyncTask, nicht auf Ihr Fragment.2)
Fragment
hat kein runOnUiThread.Tut es
Activity
jedoch.Beachten Sie, dass
Activity
nur ausgeführt wird,Runnable
wenn Sie sich bereits im Hauptthread befinden, andernfalls wird a verwendetHandler
. Sie können einHandler
in Ihrem Fragment implementieren, wenn Sie sich nicht um den Kontext von kümmern möchten.this
Es ist eigentlich sehr einfach:EDIT: @rciovati ist richtig, du bist dabei
onPostExecute
, das ist schon im Haupt-Thread.quelle
get
. Überprüfen Sie immer zuerst auf Null.getActivity().runOnUiThread
mitif (isAdded())
und es funktioniert gutIn Xamarin.Android
Für Fragment:
Für Aktivität:
Viel Spaß beim Codieren :-)
quelle
Verwenden Sie eine Kotlin-Erweiterungsfunktion
Dann können
Fragment
Sie in jedem einfach anrufenrunOnUiThread
. Dadurch bleiben Anrufe über Aktivitäten und Fragmente hinweg konsistent.Wenn Sie von überall auf diesen Stil zugreifen möchten, können Sie ein gemeinsames Objekt hinzufügen und die Methode importieren:
quelle
Ich habe dies verwendet, um Datum und Uhrzeit in einem Fragment abzurufen.
quelle
Sie können Runnable auch mithilfe der Ansicht eines anderen Threads veröffentlichen. Stellen Sie jedoch sicher, dass die Ansicht nicht null ist:
Laut Dokumentation:
"Boolescher Beitrag (ausführbare Aktion) Bewirkt, dass die ausführbare Datei zur Nachrichtenwarteschlange hinzugefügt wird. Die ausführbare Datei wird im Thread der Benutzeroberfläche ausgeführt."
quelle