Estou tentando converter uma atividade em fragmento. A marca de erro acesa runOnUiThread
. no passado:
GoogleActivityV2 estende-se de Activity. runOnUiThread na classe ExecuteTask. classe ExecuteTask aninhada na atividade.
(Executar ok) agora:
GoogleActivityV2 estende-se de Fragment. runOnUiThread na classe ExecuteTask. classe ExecuteTask aninhada na atividade. (Erro em runOnUiThread)
aqui está meu código
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
}
}
o erro diz:
como posso corrigir esse erro?
Respostas:
Experimente isto:
getActivity().runOnUiThread(new Runnable...
É porque:
1) o implícito
this
em sua chamada pararunOnUiThread
está se referindo a AsyncTask, não seu fragmento.2)
Fragment
não tem runOnUiThread.No entanto,
Activity
sim.Observe que
Activity
apenas executa oRunnable
se você já estiver no thread principal, caso contrário, ele usa umHandler
. Você pode implementar umHandler
em seu fragmento se não quiser se preocupar com o contexto dethis
, na verdade é muito fácil:EDIT: @rciovati está certo, você está dentro
onPostExecute
, isso já está no tópico principal.fonte
get
. Sempre verifique primeiro se há nulo.getActivity().runOnUiThread
comif (isAdded())
e funciona bemEm Xamarin.Android
Para Fragmento:
Para atividade:
Boa codificação :-)
fonte
Use uma função de extensão Kotlin
Depois, em qualquer
Fragment
um, basta ligarrunOnUiThread
. Isso mantém as chamadas consistentes entre atividades e fragmentos.Se você deseja acessar este estilo de qualquer lugar, pode adicionar um objeto comum e importar o método:
fonte
Usei isso para obter a data e a hora em um fragmento.
fonte
Você também pode postar executável usando a visualização de qualquer outro tópico. Mas certifique-se de que a visualização não seja nula:
De acordo com a documentação:
"Post boolean (ação Runnable) Faz com que o Runnable seja adicionado à fila de mensagens. O runnable será executado no thread da interface do usuário."
fonte