【问题标题】:How to pause and resume thread in android如何在android中暂停和恢复线程
【发布时间】:2014-06-26 17:07:52
【问题描述】:

当我在AbstractThreadedSyncAdapter 中收到UserRecoverableAuthIOException 时,我正在创建如下通知。

这是我创建服务的方式:

@覆盖 公共 IBinder onBind(Intent arg0) { // TODO 自动生成的方法存根 Log.i("服务", "线程启动"); 返回 this.getSyncAdapter().getSyncAdapterBinder(); }

private GoogleTasksSyncAdapter getSyncAdapter() {
    if (syncAdapter == null)
    {
        Log.i("Service", "syncAdapter started");
        syncAdapter = new MySyncAdapter(this);

    }
    return syncAdapter;

}

线程启动后,我将发出通知。但是一旦用户点击通知,他们就可以看到授权活动。授权后如何从最后一点恢复。即在 Syncadapter 中关闭活动后如何获得通知。

【问题讨论】:

    标签: android multithreading android-asynctask adapter android-syncadapter


    【解决方案1】:

    SyncAdapter 线程正在运行,您想在 SyncAdapter 结束时收到通知,对吗?

    因此,您可以将 SyncAdapter 线程与 BroadCast 通信。

    在您的 SyncAdapter 类中:

    Intent i = new Intent(SYNC_FINISHED);
        context.sendBroadcast(i);
        Log.i(TAG, "Network synchronization complete");
    

    在活动或片段中:

    private BroadcastReceiver syncFinishedReceiver = new BroadcastReceiver() {
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "Sync finished!!");
    
            // Here you can send your notification or another thing that you want
        }
    };
    
    @Override
    public void onStart() {
        super.onStart();
        getActivity().registerReceiver(syncFinishedReceiver, new IntentFilter(SyncAdapter.SYNC_TASK_FINISHED));
    }
    
    @Override
    public void onStop() {
        super.onStop();
        getActivity().unregisterReceiver(syncFinishedReceiver);
    }
    

    注意:SYNC_FINISHED 常量,您可以之前在 SyncAdapter 中定义

    希望对你有所帮助。

    您好!

    【讨论】:

    • 嗨,非常感谢。但是我希望在待定意图授权完成后进行回调。即我将获得授权屏幕,我将授权服务,一旦关闭,我需要从我开始同步活动的点恢复
    • 但是,当发生异常时,syncAdapter 会继续运行,因此 SyncAdapter 线程将完成。您可以尝试以下操作:当同步方法生成异常时,您会收到通知并在下一个方法中使用 Bundle 启动另一个同步活动。 ContentResolver.requestSync(account, CONTENT_AUTHORITY, bundle);你明白我了吗?如果你愿意,我会用代码发布另一个答案。我希望这行得通。
    • 嗨,我没听明白。我只想知道通知活动完成后如何重新启动同步。你能贴一段代码吗?非常感谢您的支持
    • 看我的另一个答案!如果对你有帮助,请告诉我!
    • 嗨谢谢你,授权部分是内置的,即javadoc.google-api-java-client.googlecode.com/hg/1.12.0-beta/…。一旦我得到异常,就会调用一个内置的意图。在此直接的帮助下,我正在启动一个未决的意图。我没有授权意图在我的控制中:(
    【解决方案2】:

    在您的 SyncAdapter 中,您可以执行以下操作:

        @Override
    public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
    
        Log.i(TAG, "Beginning network synchronization");
    
        if(extras.getBoolean(RUN_METHOD_1) || extras.getBoolean(RUN_ALL)) {
            method1();
        }
        if(extras.getBoolean(RUN_METHOD_2) || extras.getBoolean(RUN_ALL)) {
            method2();
        }
    }
    
    public void method1(){
      try{
            // do something
    
         } catch (Exception e) {
           e.printStackTrace();
    
           // here you can send your notification when exception occours.
         }
    }
    
    public void method2(){
      try{
            // do something
    
         } catch (Exception e) {
           e.printStackTrace();
    
           // here you can send your notification when exception occours.
         }
    }
    

    在您的“授权”代码中,您可以执行以下操作:

            Bundle b = new Bundle();
            b.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
            b.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
            b.putBoolean(SyncAdapter.RUN_METHOD_1, true);
    
            ContentResolver.requestSync(account, CONTENT_AUTHORITY, b); 
    

    这样您就可以在同步停止的地方运行。

    你好!!!

    【讨论】:

      【解决方案3】:

      这是解决方案,

      我们需要使用syncResult.stats.numAuthExceptions 来告知异常,它会自动抛出消息。 syncResult.delayUntil 将等待并在经过一段时间后重新开始同步

      How to show sync failed message

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-01
        相关资源
        最近更新 更多