2013-01-25 179 views
5

我的应用程序有一个登录活动,并通过互联网网站检查证书。 为此,我(必须)使用AsyncTask类。 登录成功时,全局变量设置为true。火灾事件结束

因为这是异步的,该活动将不会等待结果,所以我想补充一点,是由类的AsyncTask的执行后,方法触发的事件。 然后在登录活动listener将关闭本身和主要活动是可见的。

我想知道是否和如何这是可能的。 我已经尝试了其他职位的一些例子,但无法从中找出答案。

我想我必须做到以下几点: - 在 的AsyncTask类创建interface - 从该类的post_execute方法,我养的事件,但如何? - 把在登录活动listener,但如何?

任何帮助表示赞赏。

问候, 埃里克

+1

您可以轻松地创建这样的广播接收器,但你也可以做一个专门的登录活动,使用户一旦任务完成要么推出一个新的活动或'完成(),然后等待'当前的去背部。 –

+0

你尝试过'Handler'吗?如果没有,请尝试一次。 –

回答

5

我想补充一点,是由触发的事件后执行的AsyncTask类的方法。然后,登录活动的监听者将自行关闭,主要活动可见。

onPostExecute()已经是一个回调,像你描述的,你可以创建另一个回调,但它是不必要的。只需通过登录活动的参考您的AsyncTask然后用它来打电话finish()startActivity()onPostExecute()

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

在第二,建立接收时后完成的意图类(扩展广播接收器)。

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

将此服务注册到您的Manifest文件中。

<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); 
+0

谢谢。但我现在认为这有点凌驾于我的头上。 – Eric