2013-01-25 30 views
5

Ứng dụng của tôi có hoạt động đăng nhập và nó kiểm tra thông tin đăng nhập qua trang web internet. Để làm như vậy, tôi (phải) sử dụng một lớp AsyncTask. Khi đăng nhập thành công, biến toàn cục được đặt thành true.Sự kiện cháy trên AsyncTask đã hoàn thành

Bởi vì điều này là không đồng bộ, hoạt động sẽ không chờ kết quả vì vậy tôi muốn thêm sự kiện được kích hoạt bằng phương thức hậu thi hành của lớp AsyncTask. Sau đó, listener về hoạt động đăng nhập sẽ tự đóng và hoạt động chính hiển thị.

Tôi muốn biết liệu điều này có thể thực hiện được hay không. Tôi đã thử một số ví dụ từ các bài đăng khác, nhưng không thể tìm ra từ những bài đăng đó.

Tôi nghĩ rằng tôi phải làm như sau: - tạo ra một interface trong AsyncTask lớp - từ phương pháp post_execute của lớp đó, tôi nâng cao sự kiện này, nhưng làm thế nào? - đặt listener trong hoạt động đăng nhập, nhưng làm cách nào?

bất kỳ trợ giúp nào được đánh giá cao.

Kính trọng, Eric

+1

Bạn có thể dễ dàng tạo ra một BroadcastReceiver cho điều này, mặc dù bạn cũng có thể tạo Hoạt động đăng nhập chuyên dụng, giữ cho người dùng chờ đợi sau đó một lần nhiệm vụ hoàn thành hoặc khởi động một Hoạt động mới hoặc 'kết thúc()' một hiện tại để đi trở lại. –

+0

Bạn đã thử 'Handler' chưa? nếu không, hãy thử một lần. –

Trả lời

5

Tôi muốn thêm một sự kiện mà là bắn bởi các hậu phương thức execute của lớp AsyncTask. Sau đó, người nghe trên hoạt động đăng nhập sẽ tự đóng và hoạt động chính hiển thị.

đã là một cuộc gọi lại, bạn có thể tạo một cuộc gọi lại khác giống như bạn đã mô tả nhưng không cần thiết. Chỉ cần chuyển tham chiếu Hoạt động đăng nhập của bạn tới AsyncTask của bạn, sau đó sử dụng nó để gọi finish()startActivity() trong onPostExecute().

2

Lúc đầu, tạo lớp bài viết của bạn, sử dụng AsyncTask hoặc IntentService như sau ...

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

Tại thứ hai, tạo ra lớp học của bạn (mở rộng BroadcastReceiver) mà nhận được mục đích khi một bài xong.

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

Đăng ký dịch vụ này trong tệp kê khai của bạn.

<service android:name=".PostIntentService" /> 

Đăng ký việc tiếp nhận này trong onTạo Hoạt động chính của bạn.

IntentFilter filter = new IntentFilter(PostBroadcastReceiver.ACTION_RESPONSE); 
filter.addCategory(Intent.CATEGORY_DEFAULT); 
receiver = new PostResponseReceiver(this); 
registerReceiver(receiver, filter); 

Và thực hiện phương pháp sau trong hoạt động chính của bạn.

public void onPostFinished() { 
    Log.d("onPostFinished", "onPostFinished"); 
} 
public void onPostFailed() { 
    Log.d("onPostFailed", "onPostFailed"); 
} 

Đừng quên Hủy đăng ký người nhận này trong khiHãy hủy hoạt động chính của bạn.

unregisterReceiver(receiver); 

Cuối cùng, thực hiện chuyển trong Hoạt động đăng nhập của bạn.

Intent intent = new Intent(this, PostIntentService.class); 
intent.putExtra("data", mData); 
startService(intent); 
+0

cảm ơn bạn. nhưng tôi nghĩ rằng điều này một chút trên đầu của tôi ngay bây giờ. – Eric

Các vấn đề liên quan