Wie zu verwenden AsyncTask in-Dienste in Android?
Ich versuche zu laufen code unten es gibt Ausnahme sagen:
java.lang.RuntimeException: Unable to start service com.example.testfeeds.UpdateWidgetService@410a33c8 with Intent { cmp=com.example.testfeeds/.UpdateWidgetService (has extras) }: android.os.NetworkOnMainThreadException
denen ich verstehe, dass eine neue version von Android wird nicht zulassen, dass Netzwerk-Operationen im Haupt-thread. Menschen, die mir vorgeschlagen zu verwenden Asynchrone Aufgabe
aber ich weiß nicht, wie man das nutzen. Kann mir jemand zeigen, im code unten?
Vielen Dank im Voraus
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.
//////////////////////////////////////////////////////////////////////////////////
}
- Bitte entfernen Sie nicht den relevanten code, um uns zu helfen, mit Ihrer Frage.
- gleiche wie Sie verwenden Sie Sie in Aktivitäten!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, diese Frage könnte für Sie hilfreich sein: Wie zu verwenden AsyncTask
Können Sie machen Sie Ihre AsyncTask eine innere Klasse von Ihrem Service, und tun Sie Ihre Netzwerk-Operationen in der
doInBackground()
Methode der AsyncTask. VondoInBackground()
können Sie wieder jede Art von Daten deronPostExecute()
Methode der AsyncTask, wo man die weiteren Sachen mit den empfangenen Daten.Und hier, ein AsyncTask-Beispiel: AsyncTask von Android Beispiel
Einem einfachen Beispiel:
Verwenden neue
YourAsyncTask ().execute()
zu nennen.ist es über den ui-thread. Ich denke, Services, haben einige Probleme mit der ui-thread. onPostExecutes ausgeführt werden, auf dem ui-thread. so, da Dienstleistungen nicht-ui-thread, es bricht mit dem ausführen von onPostExecute auf nicht-ui-thread.
Schlage ich vor,
natürlich, dies ist nicht Thread-pool in AsyncTask, aber Sie können konvertieren Sie mit diesem code einen Thread-pool.
Als Beispiel:
Haben Sie log-in-Aktivität und, wenn Sie die Taste "Login" - Anwendung bestätigen müssen gegen Dienst und wechseln Sie zur wichtigsten Aktivität:
Und dies ist, wie ich es nennen:
Ziemlich einfaches Beispiel, das Ihnen helfen wird, die Dinge zu Sortieren neben Theorie
Handler
Wenn API version 11 oder höher android:targetSDk nicht erlauben netwrok auf Haupt-thread, Aber es funktioniert in unten in den Waben.n
Versuchen, Sie zu entfernen android:targetSdkVersion Linie von Ihrem manifest.
Ich Tat dies in 3rd-party-code und die Arbeit für mich die meiste Zeit.
Es funktionierte für mich.