Асинхронные задачи Android не работают при использовании в сервисе?

1

Я занимаюсь созданием фоновой задачи, которая делает сетевые вызовы; однако мое развитие застопорилось в результате того, что я не могу получить свою AsyncTask, которую я создал для работы, что я сделал, - я помещал тосты в разных точках кода, чтобы увидеть, где эта проблема. Я понял, что получаю тосты во всех точках вплоть до метода pre execute AsyncTask; однако, в doInBackground и postexecute, я ничего не получил.

Почему это? и если это не может быть сделано, то какова работа?

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();
        }

    }
} 
Теги:
android-asynctask
android-service

2 ответа

0
Лучший ответ

Как уже указывал кто-то другой, тосты не будут работать в doInBackground поскольку это работает на отдельном потоке. Кроме того, выполняете ли вы свой AsyncTask?

Не должно быть:

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

Обратите внимание на .execute().

0

Тосты можно выбросить только из потока пользовательского интерфейса. doInBackground работает над потоком, отличным от UI, поэтому бросать тосты не окажут никакого влияния.

Не получается ничего в onPostExecute странно!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню