2012-01-22 5 views
1

ネットワークコールを行うバックグラウンドタスクを設定中です。しかし、私の開発は、私がAsyncTask私が働くように設定していることができないという事実の結果として、ストールしました。私は、コード内の様々な場所でトーストを配置して、 。 AsyncTaskの事前実行メソッドまですべてのポイントでトーストを取得することがわかりました。しかし、doInBackgroundpostexecuteでは、私は何も得られません。Android Asyncタスクは、サービスで使用されても機能しませんか?

これはなぜですか?これができない場合は、何が回避策ですか?

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

トーストは、UIスレッドからのみスローすることができます。 doInBackgroundはUI以外のスレッドで実行されるため、Toastを投げても何の影響もありません。

何も取得していないonPostExecuteは奇妙です!