我的应用有登录活动,它通过互联网网站检查凭据。 为此,我(必须)使用AsyncTask类。 登录成功后,全局变量将设置为true。
因为这是异步的,所以活动不会等待结果,所以我想添加一个由AsyncTask类的后执行方法触发的事件。
然后登录活动的listener
将关闭,主要活动可见。
我想知道是否以及如何做到这一点。 我已尝试过其他帖子的一些例子,但无法从中找到答案。
我想我必须做以下事情:
- 在interface
课程中创建AsyncTask
- 从该课程的post_execute
方法中,我提出了这个事件,但是如何?
- 在登录活动中添加listener
,但是如何?
感谢任何帮助。
此致 埃里克
答案 0 :(得分:6)
我想添加一个由AsyncTask类的后执行方法触发的事件。然后登录活动的监听器将自行关闭,主活动可见。
onPostExecute()
已经是一个回调,你可以像你描述的那样创建另一个回调,但这是不必要的。只需将登录活动的参考传递给您的AsyncTask,然后使用它在finish()
中拨打startActivity()
和onPostExecute()
。
答案 1 :(得分:2)
首先,使用Asynctask或IntentService创建你的帖子类,如下面的......
public class PostIntentService extends IntentService implements PostTask.Observer {
private int counter = 0;
private int retry = 2;
private Data mData;
public PostIntentService() {
super("PostIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
mData = (Data) intent.getSerializableExtra("data");
// send updating status
Intent i = new Intent();
i.setAction(PostResponseReceiver.ACTION_RESPONSE);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.putExtra("status", "updating");
sendBroadcast(i);
execute();
counter++;
}
@Override
public void onSuccessPost(String result) {
// send success status
Intent i = new Intent();
i.setAction(PostResponseReceiver.ACTION_RESPONSE);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.putExtra("status", "success");
sendBroadcast(i);
}
@Override
public void onFailedPost(String result) {
if (counter < retry) {
execute();
counter++;
}
else {
// send failed status
Intent i = new Intent();
i.setAction(PostResponseReceiver.ACTION_RESPONSE);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.putExtra("status", "failed");
i.putExtra("data", mData);// for reproduct
sendBroadcast(i);
}
}
private void execute() {
PostTask task = new PostTask(this);
task.execute();
}
}
第二步,创建你的类(扩展的BroadcastReceiver),它在帖子结束时接收意图。
public class PostBroadcastReceiver extends BroadcastReceiver {
public static final String ACTION_RESPONSE = "com.example.android.intent.action.POST_PROCESSED";
private static final int POST_REQUEST = 100;
private Observer mObserver;
public PostBroadcastReceiver(Observer observer) {
mObserver = observer;
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getStringExtra("status").equals("updating")) {
}
else if (intent.getStringExtra("status").equals("success")) {
if (mObserver != null) {
mObserver.onPostFinished();
}
}
else if (intent.getStringExtra("status").equals("failed")) {
if (mObserver != null) {
mObserver.onPostFailed();
}
}
}
public interface Observer {
public void onPostFinished();
public void onPostFailed();
}
}
在您的清单文件中注册此服务。
<service android:name=".PostIntentService" />
在主要活动的onCreate中注册此接收者。
IntentFilter filter = new IntentFilter(PostBroadcastReceiver.ACTION_RESPONSE);
filter.addCategory(Intent.CATEGORY_DEFAULT);
receiver = new PostResponseReceiver(this);
registerReceiver(receiver, filter);
在主要活动中实施以下方法。
public void onPostFinished() {
Log.d("onPostFinished", "onPostFinished");
}
public void onPostFailed() {
Log.d("onPostFailed", "onPostFailed");
}
不要忘记在主要活动的onDestroy中取消注册此接收器。
unregisterReceiver(receiver);
最后,在您的登录活动中执行转移。
Intent intent = new Intent(this, PostIntentService.class);
intent.putExtra("data", mData);
startService(intent);