我正在尝试设计一个并行完成两个不同任务的应用程序 当用户按下活动中的按钮时,每个任务都会开始执行“所以我有三个活动,其中两个应该执行某些任务,第三个应该收集结果”。
当用户按下活动上的按钮时,它将调用一个线程,然后将加载下一个活动
在第三个活动中,我有一个按钮“我称之为发送按钮”,该按钮应该保持不活动状态或禁用,直到所有线程完成其工作,所以此时它将被启用并且此活动包含纯文本以显示这些结果两个线程,当用户按下此按钮时,它将以纯文本形式将信息发送到网站。
我的问题是:如何在不同的活动中运行Threads并将结果发送到另一个活动?如何在所有线程完成工作之前禁用“发送按钮”。
我尝试在第三个活动的onCreate方法中使用全局变量进行while循环但是它崩溃了应用程序并且活动没有启动
答案 0 :(得分:1)
您有两个选项可以执行长时间运行的后台任务:
根据您的实际使用情况,该服务是首选。
答案 1 :(得分:0)
看看Path。
以下是您的工作方式:
public class PostTweetJob extends Job {
public static final int PRIORITY = 1;
private String text;
public PostTweetJob(String text) {
// This job requires network connectivity,
// and should be persisted in case the application exits before job is completed.
super(new Params(PRIORITY).requireNetwork().persist());
}
@Override
public void onAdded() {
// Job has been saved to disk.
// This is a good place to dispatch a UI event to indicate the job will eventually run.
// In this example, it would be good to update the UI with the newly posted tweet.
}
@Override
public void onRun() throws Throwable {
// Job logic goes here. In this example, the network call to post to Twitter is done here.
webservice.postTweet(text);
}
@Override
protected boolean shouldReRunOnThrowable(Throwable throwable) {
// An error occurred in onRun.
// Return value determines whether this job should retry running (true) or abort (false).
}
@Override
protected void onCancel() {
// Job has exceeded retry attempts or shouldReRunOnThrowable() has returned false.
}
}
在您的活动上,按以下方式调用此作业:
public void onSendClick() {
final String status = editText.getText().toString();
if(status.trim().length() > 0) {
jobManager.addJobInBackground(new PostTweetJob(status));
editText.setText("");
}
}
在onRun()
方法完成工作后,您可以做任何您想做的事。
如果出现问题,我们会调用onCancel()
,您也可以从那里发送错误消息。
现在关于向不同的活动/类发送消息,您可以使用事件来完成。
您可以创建方法,然后@subscribe
使用Otto收听事件。
在您的活动中,您可以:
@Subscribe
public void onJobFinishedEvent(JobFinishedEvent event) {
Toast.makeText(this, "Finished! :)", Toast.LENGTH_SHORT).show();
}
然后,您可以在onRun()
和onCancel()
工作方法中触发事件。类似的东西:
Bus bus = new Bus();
bus.post(new JobFinishedEvent(42));
这将调用onJobFinishedEvent()
我们刚刚@Subscribed的活动。{/ p>
了解有关Otto here的更多信息。
希望这有帮助。
答案 2 :(得分:0)
当您需要与应用程序进行用户交互时,请仅使用 <活动。否则,您可以使用AsyncTask为您的作业调用这两个线程(如果您希望系统为您处理工作线程。除非您不立即进行任何配置更改 - >性能命中。)
请记住,只有当后台作业运行露点时才应使用AsyncTask。如果您有一个长时间运行的作业,那么使用带有自定义线程的服务。
希望这会有所帮助。
答案 3 :(得分:0)
您可以使用 AsyncTask 。 AsyncTask是一个用于在没有线程的情况下执行后台进程的类。您可以轻松检查流程是否完成。检查此Tutorial。这可以帮助您了解如何使用AsyncTask运行后台进程。