【问题标题】:Bypass async task after a period of time一段时间后绕过异步任务
【发布时间】:2015-04-03 07:49:48
【问题描述】:

解释我要做什么:

我的应用程序连接到蓝牙打印机并打印一些数据。 这是在 AsyncTask 中完成的(我们称之为 asyncPrint),以便用户可以同时正常使用应用程序。

asyncPrint 准备数据并将其提供给打印机。现在要准备数据,调用另一个 asyncTask(我们称之为 asyncData)连接到 Web 服务以获取一些数据。因为在打印之前我需要数据,所以我这样称呼它:

String a = ws.get();

这样打印会一直等到 asyncData 完成。

但是如果互联网连接速度很慢,这可能需要 30 秒,所以我想要做的是,如果我等待 5 秒,应该绕过 asyncData 而不是停止或取消,并且打印应该在没有来自互联网的数据的情况下进行。

asyncData 仍应完成,因为它在完成后还会将一些数据保存到数据库中。

任何想法如何使这成为可能?

【问题讨论】:

  • 您需要服务和异步任务,而不仅仅是异步任务。 IntentService 两者都做,使用它。当您使用它时,请使用 SyncAdapter 来同步您的数据。如果你卡在某个地方,请开始编写一些代码并将其发布在此处。您已经知道要做什么,诀窍就是开始编写代码。如果最初并不完美,请不要担心。
  • 你想做什么?想要取消的任务,如果你取消它,它就会停止执行。
  • @BhavdipPathar 我不想取消它,如果 ws.get() 在那段时间内没有完成,只需等待 5 秒钟,然后不取消就通过它。
  • @StephanBranczyk 我会检查intentService,但你能否更具体地告诉我应该如何实现,我可以等待异步完成一段时间,如果它没有完成则绕过它?跨度>

标签: android android-asynctask


【解决方案1】:

如何:您同时启动两个任务,但打印任务延迟 5 秒。如果有任何数据从服务器到达,请使用它,否则,请继续。

在看起来像这样的伪代码中:

public class MyActivity extends Activity{

    String dataFromServer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Start both tasks
        startGetDataFromServerTask();
        startPrinterTask();
    }

    private void startGetDataFromServerTask() {
        new GetDataFromServerTask(new OnTaskFinished() {
            public void onTaskFinished(String result) {
                dataFromServer = result;

                // additionally
                saveToDatabase(dataFromServer);
            }
        }).execute();

        // OnTaskFinished is in interface callback that you use to pass the result from the
        // asynctask to your calling activity.
    }

    private void startPrinterTask() {
        // Delay the task by 5 seconds.
        // If the data from server managed to arrive, good, the printer task will have it.
        // Otherwise, it won't (you'll have to check for null in the task)
        new Handler().postDelayed(new Runnable() {

            public void run() {
                new PrinterTask(dataFromServer).execute();
            }
        }, 5 * 1000);
    }
}

【讨论】:

  • 我正在考虑这种方式,但如果互联网良好,数据会在一秒钟内到达,而客户端必须不必要地等待 4 秒。有什么想法可以解决吗? :D
  • 不能自行取消,但可以使用removeCallbacks(Runnable r):developer.android.com/reference/android/os/…取消
【解决方案2】:

您好,您可以使用具有 5 * 1000 磨机后延迟的 Handler。一起启动两个任务并在句柄内部验证数据是否可用(如果可用)然后打印数据,否则跳过它。第一个异步任务也会将数据保存在您的数据库中,谢谢。

【讨论】:

  • 我正在考虑这种方式,但如果互联网良好,数据会在一秒钟内到达,而客户端必须不必要地等待 4 秒。有什么想法可以解决吗? :D
  • 可以删除处理程序 handler.removeCallbacksAndMessages(null);在 async 任务的 asyncData onFinsh 方法中。这将删除您的 5 秒回调。
  • 听起来可以。如果可行,我会尝试并接受您的回答:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多