2017-02-13 12 views
0

Я пытаюсь использовать AsyncTask в службе android, но это не сработало. Может кто-нибудь мне помочь? Я использую фрагменты, и я новичок. Заранее спасибо. Ошибка: невозможно разрешить метод. Вот моя реализация.Запуск AsyncTask в службе - 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

Вы пытаетесь вызвать 'runOnUiThread' в службе; этот метод доступен только в Activity. В этом случае, в рамках службы, вам даже не нужно будет использовать AsyncTask, просто используйте созданный вами поток, чтобы сделать свой запрос. – iainmcgin

ответ

0

Заканчивать этот код может быть работа ..

общественного класса MyService расширяет Услуги

{

@Override

}

@Override

общественного ИНТ onStartCommand (Намерение Намерение, Int флаги, внутр startId)

{

// Мы хотим, чтобы эта служба продолжала работать до тех пор, пока не будет явно указано

// остановлено, поэтому верните липкое.

Toast.makeText (это «Сервис запущен», Toast.LENGTH_LONG) .show();

попробовать

{

новый DoBackgroundTask(). Выполнить (

Новый URL ("");

новый URL (""));

}

улов (MalformedURLException е)

{

е.printStackTrace();

}

возвращение START_STICKY;

}

@Override

общественного недействительными OnDestroy()

{

super.onDestroy();

Toast.makeText (это «Уничтоженный сервис», Toast.LENGTH_LONG) .show();

}

частное ИНТ DownloadFile (URL URL)

{

попробовать

{

// --- смоделируйте время, необходимое для загрузки файла ---

Thread.sleep (5000);

}

улов (InterruptedException е)

{

e.printStackTrace();

}

// --- возвращает произвольное число, представляющее

// размер загруженного файла ---

возвращение 100;

}

частный класс DoBackgroundTask расширяет AsyncTask

{

защищенному Long doInBackground (URL .. . url)

{

int count = urls.длина;

long totalBytesDownloaded = 0;

для (INT I = 0; я < рассчитывать; я ++)

{

TotalBytesDownloaded + = DownloadFile (urls [i]);

// --- вычислить процент скачиваний и

// сообщить о своем прогрессе ---

publishProgress ((int) (((i + 1)/(float) count) * 100));

}

возвращение totalBytesDownloaded;

}

защищен недействительным onProgressUpdate (Integer ... прогресс)

{

Log.d («Загрузка файлов», String.valueOf (прогресс [0]) + % загружено ");

Toast.makeText (getBaseContext(), String.valueOf (прогресс [0]) + «% Загружено», Toast.LENGTH_LONG) .show();

}

защищены недействительным onPostExecute (Long результат)

{

Toast.makeText (getBaseContext(), «Загруженный» + результат + «байты», Toast.LENGTH_LONG) .show();

stopSelf();

}

}

}

+0

Я хотел бы сделать http-запрос. –