J'essaye de convertir une activité en fragment. La marque d'erreur sur runOnUiThread
. Sur le passé:
GoogleActivityV2 s'étend de l'activité. runOnUiThread dans la classe ExecuteTask. class ExecuteTask imbriqué sur l'activité.
(Exécutez ok) maintenant:
GoogleActivityV2 s'étend de Fragment. runOnUiThread dans la classe ExecuteTask. class ExecuteTask imbriqué 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:
comment puis-je corriger cette erreur?
Réponses:
Essaye ça:
getActivity().runOnUiThread(new Runnable...
C'est parce que:
1) l'implicite
this
dans votre appelrunOnUiThread
fait référence à AsyncTask, pas à votre fragment.2)
Fragment
n'a pas runOnUiThread.Cependant, le
Activity
fait.Notez qu'il
Activity
exécute simplement leRunnable
si vous êtes déjà sur le thread principal, sinon il utilise unHandler
. Vous pouvez implémenter aHandler
dans votre fragment si vous ne voulez pas vous soucier du contexte dethis
, c'est en fait très simple:EDIT: @rciovati a raison, vous y êtes
onPostExecute
, c'est déjà sur le fil principal.la source
get
. Vérifiez toujours la valeur null en premier.getActivity().runOnUiThread
avecif (isAdded())
et il fonctionne très bienDans Xamarin.Android
Pour le fragment:
Pour l'activité:
Bon codage :-)
la source
Utiliser une fonction d'extension Kotlin
Ensuite, dans tout
Fragment
ce que vous pouvez simplement appelerrunOnUiThread
. Cela maintient les appels cohérents entre les activités et les fragments.Si vous souhaitez accéder à ce style de n'importe où, vous pouvez ajouter un objet commun et importer la méthode:
la source
J'ai utilisé ceci pour obtenir la date et l'heure dans un fragment.
la source
Vous pouvez également publier des articles exécutables en utilisant la vue de n'importe quel autre fil de discussion. Mais assurez-vous que la vue n'est pas nulle:
Selon la documentation:
"Boolean post (action Runnable) Provoque l'ajout du Runnable à la file d'attente des messages. Le runnable sera exécuté sur le thread de l'interface utilisateur."
la source