Cómo utilizar AsyncTask en Servicios en Android?

Estoy tratando de ejecutar por debajo del código que da la excepción diciendo:

java.lang.RuntimeException: Unable to start service com.example.testfeeds.UpdateWidgetService@410a33c8 with Intent { cmp=com.example.testfeeds/.UpdateWidgetService (has extras) }: android.os.NetworkOnMainThreadException 

Que entiendo que la nueva versión de Android no permitirá las operaciones de red en el hilo principal. La gente me sugirió que usara Async Task pero no sé cómo usar eso. ¿Puede alguien mostrarme debajo del código?

Gracias por adelantado

 public class WidgetService extends Service { /* * So pretty simple just defining the Adapter of the listview * here Adapter is ListProvider * */ /*@Override public RemoteViewsFactory onGetViewFactory(Intent intent) { int appWidgetId = intent.getIntExtra( AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); return (new ListProvider(this.getApplicationContext(), intent)); }*/ public static int numberOfItems=0; //numberOfItems=0; private static String LOG = "testwidgets"; ArrayList<String> feedsPubDate; @SuppressWarnings("deprecation") @Override public void onStart(Intent intent, int startId) { Log.i(LOG, "Called"); // Create some random data feedsPubDate=new ArrayList<String>(); AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this .getApplicationContext()); int[] allWidgetIds = intent .getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS); ComponentName thisWidget = new ComponentName(getApplicationContext(), WidgetProvider.class); int[] allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget); Log.w(LOG, "From Intent" + String.valueOf(allWidgetIds.length)); Log.w(LOG, "Direct" + String.valueOf(allWidgetIds2.length)); for (int widgetId : allWidgetIds) { // Create some random data /////////////////////////////////////////////////////////////////////////// RemoteViews remoteViews = new RemoteViews(this.getApplicationContext().getPackageName(), R.layout.widget_layout); Log.d("numberOfItems intially", String.valueOf(numberOfItems)); try { numberOfItems=doTestFeed(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } // Set the text remoteViews.setTextColor(R.id.empty_view,Color.WHITE); remoteViews.setTextViewText(R.id.empty_view," "+ String.valueOf(numberOfItems)); Log.w(LOG, String.valueOf(numberOfItems)); //////////////////////////////////////////////////////////////////////////// // Register an onClickListener Intent clickIntent = new Intent(this.getApplicationContext(), WidgetProvider.class); clickIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, allWidgetIds); PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT); remoteViews.setOnClickPendingIntent(R.id.empty_view, pendingIntent); appWidgetManager.updateAppWidget(widgetId, remoteViews); } stopSelf(); super.onStart(intent, startId); } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; } int doTestFeed() throws MalformedURLException, ParseException { Log.d("msg"," in do test feed"); InputStream is = null; int x = 0; URL myURL = new URL("http://yunn.yu.edu.jo/index.php?option=com_content&view=category&id=55&layout=blog&Itemid=104&format=feed&type=rss"); try { URLConnection conn = myURL.openConnection(); is = conn.getInputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } XmlPullParserFactory pullParserFactory; try { pullParserFactory = XmlPullParserFactory.newInstance(); XmlPullParser parser = pullParserFactory.newPullParser(); parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); parser.setInput(is, null); Log.d("msg","before making parsing"); x=parseXML(parser); Log.d("msg","after making parsing"); } catch (XmlPullParserException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } Log.d("msg"," done testing"); return x; } ////////////////////////////////////////////////////////////////////////////////// @SuppressLint("SimpleDateFormat") private int parseXML(XmlPullParser parser) throws XmlPullParserException,IOException, ParseException { Log.d("msg"," in parser"); int eventType = parser.getEventType(); int getElement=0; String pubDate=null; while (eventType != XmlPullParser.END_DOCUMENT){ String tagName = null; switch (eventType){ //----------------------------------// case XmlPullParser.START_DOCUMENT: { // do nothing } break; //----------------------------------// case XmlPullParser.START_TAG: { tagName = parser.getName(); if ("item".equals(tagName)){ getElement=1; } else if (getElement!=0){ if ("pubDate".equals(tagName)){ pubDate= parser.nextText(); feedsPubDate.add(pubDate); Log.d("value",pubDate); } } } break; //----------------------------------// case XmlPullParser.END_TAG: { tagName = parser.getName(); if (tagName.equalsIgnoreCase("item") && getElement != 0){ } } break; //----------------------------------// }// end-switch. eventType= parser.next(); }// end-while. int i=0; SharedPreferences sp = getSharedPreferences("tempData", 0); String dateStringA=sp.getString("recentPubDate", null); Log.d("oldest date",dateStringA); for(String s : feedsPubDate ) { String dateStringB = feedsPubDate.get(i); SimpleDateFormat parserSDF = new SimpleDateFormat("EEE, DD MMM yyyy HH:mm:ss"); Date dateA = null; try { dateA = parserSDF.parse(dateStringA); } catch (java.text.ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } Date dateB = null; try { dateB = parserSDF.parse(dateStringB); } catch (java.text.ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (dateA.compareTo(dateB) < 0) { Log.d("imp msg","one new item"); numberOfItems++; } i++; } Log.d("update result", String.valueOf(numberOfItems)); // Toast.makeText(GeneralNews.this,"The size of the list"+feedsTitles.size() , Toast.LENGTH_LONG).show(); return numberOfItems; } //end xmlParser method. ////////////////////////////////////////////////////////////////////////////////// } 

5 Solutions collect form web for “Cómo utilizar AsyncTask en Servicios en Android?”

Creo que esta pregunta podría ser útil para usted: Cómo utilizar AsyncTask

Puede convertir su AsyncTask en una clase interna de su Servicio y hacer sus operaciones de red en el método doInBackground() de AsyncTask. Desde doInBackground() puedes devolver cualquier tipo de datos al método onPostExecute() de AsyncTask, donde puedes hacer más cosas con los datos recibidos.

Y aquí, un ejemplo de AsyncTask : Ejemplo de AsyncTask Android

Si la versión de la API es 11 o superior android: targetSDk no permite red en el hilo principal Pero funciona en la parte inferior de HoneyComb.n

Intenta eliminar la línea android: targetSdkVersion de tu manifiesto. Hice esto en el código de la tercera parte y trabajo para mí la mayor parte del tiempo.

Funcionó para mí.

Se trata de hilo ui. Supongo que los servicios tienen algunos problemas con el hilo de ui. OnPostExecutes tienen que ejecutarse en el subproceso ui. Así, debido a los servicios no tienen hilo ui, se rompe en la ejecución onPostExecute en hilo no-ui.

yo sugiero

 new Thread(){ public void run() { Object result=null; Looper l = Looper.getMainLooper(); Handler h = new Handler(l); h.post(new Runnable() { @Override public void run() { if (result != null){ response.OnResponse(true, "", result); } else { response.OnResponse(false, errMessage, null); } } }); }; }.start(); 

Por supuesto, esto no tiene Thread pool en AsyncTask, pero puede convertir este código para usar un grupo de subprocesos.

Un ejemplo sencillo:

 public class YourAsyncTask extends AsyncTask<String, Void, String>{ @Override protected String doInBackground(String... params) { // your load work return myString; } @Override protected void onPostExecute(String result) { } } 

Utilice nuevo YourAsyncTask ().execute() para llamarla.

Como ejemplo:

Usted tiene la actividad del registro en y cuando usted presiona la aplicación del "inicio de sesión" necesita validar contra servicio y cambiar a la actividad principal:

 private class HeavyTask extends AsyncTask<String, Void, Void> { protected Void doInBackground(String... args) { //do something here // like tell to Service to do some async task return null; } protected void onPostExecute(Void results) { // here actually we wait any event from Service about task done mHandler.postDelayed(new Runnable() { @Override public void run() { mHandler.postDelayed(new Runnable() { @Override public void run() { startActivity(new Intent().setClass(FirstLoginActivity.this, MainActivity.class).setData(getIntent().getData())); finish(); } }, 1000); } }, 500); } } 

Y así es como yo lo llamo:

 HeavyTask task = new HeavyTask(); task.execute(user, passwordText, login_outbound_proxy); // as example 

Bastante simple ejemplo que le ayudará a ordenar las cosas, además de la teoría

  • ¿Cómo comprobar todos los servicios en ejecución en android?
  • ¿Cómo podemos reiniciar el servicio?
  • ¿Ya está funcionando el servicio Android?
  • Detener servicio cuando la aplicación está cerrada
  • Android Service se está ejecutando, pero no aparece en la configuración -> servicios en ejecución
  • Android - Obtención de contexto de un receptor de difusión onReceive () para enviar a
  • Servicio, WakeLock
  • Cómo detener la repetición de servicios de alarma en Android?
  • ¿Cómo mostrar Toast de un Servicio después de que la actividad principal termine?
  • WiFiDirect discoverServices sigue fallando con error 3 (NO_SERVICE_REQUESTS)
  • StartService de la clase que no extiende Actividad
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.