2017-02-13 7 views
0

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(); 
     } 
    } 
} 

}

+1

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

Antwort

0

Überprüfen Sie diesen Code aus der Arbeit sein kann ..

public class MyService erweitert Service-

{

@Override

}

@Override

public int onStartCommand (Intent Absicht, int flags, int startId

)

{

// Wir möchten, dass dieser Dienst so lange ausgeführt wird, bis er explizit

// gestoppt wird.

Toast.makeText (dies, "Dienst gestartet", Toast.LENGTH_LONG) .show();

versuchen

{

neue DoBackgroundTask(). Execute (

Neue URL ("");

neue URL (""));

}

catch (MalformedURLException e)

{

e.printStackTrace();

}

zurück START_STICKY;

}

@Override

public void onDestroy()

{

Super.onDestroy();

Toast.makeText (das, "Service Destroyed", Toast.LENGTH_LONG) .show();

}

private int Downloadfile (URL url)

{

versuchen

{

// --- simulieren Sie etwas Zeit, um eine Datei herunterzuladen ---

Thread.sleep (5000);

}

catch (InterruptedException e)

{

e.printStackTrace();

}

// --- Rück eine willkürliche Zahl, die

// die Größe der heruntergeladenen Datei ---

zurück 100;

}

private Klasse DoBackgroundTask erweitert AsyncTask

{

geschützt Lange doInBackground (URL .. . Urls)

{

int Anzahl = URLs.Länge;

lang totalBytesDownloaded = 0;

for (int i = 0; i zählen <; i ++)

{

TotalBytesDownloaded + = DownloadFile (URLs [i]);

// --- errechnen Prozentsatz heruntergeladen und

// Bericht über den Fortschritt ---

publishProgress ((int) (((i + 1)/(Gleitkommazahl) * 100));

}

Rückkehr totalBytesDownloaded;

}

protected void onProgressUpdate (Integer ... progress)

{

Log.d ("Herunterladen von Dateien", String.valueOf (Fortschritt [0]) + " % heruntergeladen ");

Toast.makeText (getBaseContext(), String.valueOf (Fortschritt [0]) + "% Heruntergeladen", Toast.LENGTH_LONG) .show();

}

protected void OnPostExecute (Long Ergebnis)

{

Toast.makeText (getBaseContext(), "Heruntergeladen" + Ergebnis + "Bytes", Toast.LENGTH_LONG) .show();

stopSelf();

}

}

}

+0

Ich möchte eine HTTP-Anfrage machen. –