2012-01-22 25 views
1

我正在設置進行網絡調用的後臺任務;然而,由於我無法獲得已設置好的我的AsyncTask這一事實,我的開發停滯不前,我所做的是我在代碼中的各個位置放置了敬酒,以查看問題發生的位置。我意識到,我將得到所有點的敬酒,直到AsyncTask的預執行方法;然而,在doInBackgroundpostexecute,我什麼也得不到。安卓異步任務在服務中使用時不起作用?

這是爲什麼?如果不能做到這一點,工作是什麼?

package com.testapp2.second.activities; 

import java.util.Date; 

import com.testapp2.second.OTweetApplication; 
import twitter4j.Twitter; 
import twitter4j.TwitterException; 
import twitter4j.User; 
import android.app.NotificationManager; 
import android.app.Service; 
import android.content.Intent; 
import android.os.AsyncTask; 
import android.os.IBinder; 
import android.widget.Toast; 

public class StatsCheckerService extends Service { 
    private OTweetApplication app; 
    private Twitter twitter; 
    User user; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     app = (OTweetApplication) getApplication(); 
     twitter = app.getTwitter(); 

     Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     if (app.isAuthorized()) { 

      Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG) 
       .show(); 
      new toastTwitterInBg(); 
     } 
     return START_STICKY; 

    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    } 

    private class toastTwitterInBg extends AsyncTask<Void, Void, User> { 

     @Override 
     protected User doInBackground(Void... arg0) { 
      try { 
       user = twitter.verifyCredentials(); 
       Toast.makeText(StatsCheckerService.this, "async tasks do in background", Toast.LENGTH_LONG).show(); 
      } catch (TwitterException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return user; 
     } 

     @Override 
     protected void onPostExecute(User result) { 
      // TODO Auto-generated method stub 
      super.onPostExecute(result); 
      Toast.makeText(StatsCheckerService.this, "async tasks on post execute finished", Toast.LENGTH_LONG).show(); 
     } 

    } 
} 

回答

0

正如其他人已經指出,敬酒不會在doInBackground工作,因爲它運行在一個單獨的線程。另外,你實際上是執行你的AsyncTask

不應該是這樣:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // .... 
    new toastTwitterInBg().execute(); 
    // .... 
} 

注意.execute()

0

Toasts只能從UI線程拋出。 doInBackground在非UI線程上運行,因此拋出Toast不會有任何影響。

沒有得到任何東西onPostExecute很奇怪!