Ich versuche, AsyncTask in Android-Dienst verwenden, aber es hat nicht funktioniert. Könnte mir jemand helfen? Ich benutze Fragmente und ich bin ein Neuling. Danke im Voraus. Fehler: kann die Methode nicht auflösen. Hier ist meine Implementierung.AsyncTask im Dienst ausführen - Android
public class MyService extends Service implements Runnable {
final String numeroPorta = "80";
final String nomeParametro = "num";
String respostaServidor;
private boolean ativo;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public int onStartCommand(Intent intent, int flags, int startID) {
ativo = true;
new Thread(this, "MyService" + startID).start();
return super.onStartCommand(intent, flags, startID);
}
@Override
public void run() {
myService();
}
@Override
public void onDestroy() {
ativo = false;
}
public void myService() {
new Thread() {
public void run() {
runOnUiThread(new Runnable() {
public void run() {
if (enderecoIP.length() > 0 && numeroPorta.length() > 0 && !Objects.equals(valorParametro, "0")) {
new HttpRequestAsyncTask(getApplicationContext(), valorParametro, enderecoIP, numeroPorta, nomeParametro).execute();
}
}
});
}
}.start();
}
public class HttpRequestAsyncTask extends AsyncTask<Void, Void, Void> {
private String requisicaoResposta, enderecoIP, numeroPorta;
private Context contexto;
private AlertDialog alerta;
private String parametro, valorParametro;
HttpRequestAsyncTask(Context contexto, String valorParametro, String enderecoIP, String numeroPorta, String parametro) {
this.contexto = contexto;
alerta = new AlertDialog.Builder(this.contexto)
.setTitle("Resposta HTTP:")
.setCancelable(true)
.create();
this.enderecoIP = enderecoIP;
this.numeroPorta = numeroPorta;
this.valorParametro = valorParametro;
this.parametro = parametro;
}
@Override
protected Void doInBackground(Void... voids) {
alerta.setMessage("Dados enviados, aguardando resposta do servidor...");
if (!alerta.isShowing()) {
alerta.show();
}
requisicaoResposta = sendRequest(valorParametro, enderecoIP, numeroPorta, parametro);
return null;
}
@Override
protected void onPostExecute(Void avoid) {
alerta.setMessage(requisicaoResposta);
if (!alerta.isShowing()) {
alerta.show();
}
}
@Override
protected void onPreExecute() {
alerta.setMessage("Enviando dados ao servidor, por favor aguarde...");
if (!alerta.isShowing()) {
alerta.show();
}
}
}
}
Sie versuchen 'runOnUiThread' in einem Dienst zu berufen; Diese Methode ist nur in einer Aktivität verfügbar. Wenn Sie innerhalb eines Dienstes nicht einmal AsyncTask verwenden müssen, verwenden Sie einfach den Thread, den Sie erstellt haben, um Ihre Anfrage zu stellen. – iainmcgin