Я занимаюсь созданием фоновой задачи, которая делает сетевые вызовы; однако мое развитие застопорилось в результате того, что я не могу получить свою 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();
}
}
}
Как уже указывал кто-то другой, тосты не будут работать в doInBackground
поскольку это работает на отдельном потоке. Кроме того, выполняете ли вы свой AsyncTask
?
Не должно быть:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// ....
new toastTwitterInBg().execute();
// ....
}
Обратите внимание на .execute()
.
Тосты можно выбросить только из потока пользовательского интерфейса. doInBackground
работает над потоком, отличным от UI, поэтому бросать тосты не окажут никакого влияния.
Не получается ничего в onPostExecute
странно!