所以我有两个Android活动(活动1( SignUpActivity ),活动2( RegisterActivity ))
第一个活动应该是在新用户(不是问题)的情况下开始第二个活动
诀窍是我需要先调用某个服务。此服务将调用某个服务器并获取一些数据以提供它(RegisterActivity)
所以为了做到这一点,有一些可能的解决方案
不需要服务,我们只能从活动1发出HTTP请求。 但是我已经有一个在SignUpActivity中扩展AsyncTask的类。它有另一项工作(基本上是用户签名。
我可以调用该服务然后调用Activity 2(这是一个简单的解决方案) 但是,第二个活动将在服务结束之前开始。这意味着它将尝试访问一些仍然为空的数据。
第二个解决方案似乎更容易实现,但我能想到的唯一方法是使用信号量锁。这是我不太擅长的东西,我不确定它是最聪明的解决方案。
我试图使用它,但它没有用,我觉得这不是正确的做法
您认为解决该问题的智能方法是什么?
答案 0 :(得分:2)
最佳选择是在特定任务完成时从第一个活动创建第二个活动。为此,您可以在活动1中创建另一个AsyncTask
并在完成后启动活动2(您可以在并列中运行多个不同目的AsyncTasks
)
的修改
要确保它们并行运行,只需将yourTask.execute(params)
更改为
yourTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params
);`为每项任务。
另一个选择是在服务决定需要时从服务创建活动2.
答案 1 :(得分:0)
我建议使用第二个AsyncTask,因为在开始第二个活动之前你肯定需要等待服务返回。
请记住,如果同时执行多个AsyncTasks,它们将由AsyncTask
类(它设置一个最多可接受10个AsyncTasks的队列)按顺序执行。
如果您确实需要并行运行这两项任务,我建议您实施ThreadPool
并使用Runnable
传递任务,包括启动第二项活动。
以下是我的某个项目的ThreadPool示例。你几乎可以复制批发,因为它非常通用。
runnable的一个例子是:
Runnable task = new Runnable() {
@Override
public void run() {
// Call service and wait for it to finish //
startActivity(new Intent("com.example.project.RegisterActivity);
}
};
ThreadPool.executeTask(task); // We use the ThreadPool to run the 'task' Runnable
如果代码抱怨需要从主线程运行,则需要使用在第一个句点中定义的Handler
来发布startActivity()
内的Runnable.
来电1} p>