从活动A创建的线程向活动B发送消息

时间:2016-04-15 06:13:57

标签: android android-asynctask

我目前有一个thread/AsyncTask,我从Activity A开始。在开始AsyncTask之前,Activity A会创建一个接收Activity A's Context的对象,以便它可以实例化NotificationCompat.Builder。该对象使用此构建器来显示/显示通知。

然后在创建并启动AsyncTask时将此对象传递给AsyncTask。这允许AsyncTask更新对象(和通知)及其进度。

启动AsyncTask后,Activity A会调用finish(),并启动启动它的活动Activity B。我现在想要发生的是,一旦AsyncTask表示100%完成,该对象就会发送/尝试向Activity B发送消息。我怎样才能做到这一点?

PS:让我知道图片是否会使场景更清晰。

3 个答案:

答案 0 :(得分:2)

据我了解,您的问题Activity A是从Activity B开始的。您可以通过startActivityForResult从B开始A然后在AsyncTask启动时完成A finish()当AsyncTask加载100%任务并将结果发送到A时。您可以实现回调接口将结果发送到Activity一个来自AsyncTask。现在使用finish()setResult()调用到活动A,并将意图中的结果传递给活动B.

答案 1 :(得分:0)

您可以使用AsyncTask的onPostExecute()方法。

private class DownloadFilesTask extends AsyncTask<Void, Void, MyObject> {

    protected Void doInBackground(Void... params) {
        //do whatever you need to do
    }

    protected void onPostExecute(MyObject myObject) {
        myObject.sendMessage(activityB);
    }
}

请注意,onPostExecute()在主UI线程上运行,因此它将能够处理UI更新。

答案 2 :(得分:0)

键入我自己的答案,因为这是我的问题评论中发生的讨论结果,所以我对解决方案所做的工作有了全面的概述。

我最终接受了生锈的大脑建议的回调。值得注意的是,我指的是使用android.os.Handler来创建回调,而不是通常用于按钮之类的回调模式。无论如何,在解决方案上。

第1步是在Activity B中设置处理程序:

messageHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        refreshList();
    }
};

handleMessage中的任何内容都是在将消息发送给处理程序时调用的内容。

第2步是将android.os.Messenger对象发送到Activity A。这可以通过用于启动Intent的{​​{1}}轻松完成:

Activity A

现在,Intent intent = new Intent(AlbumGalleryActivity.this, CreateNewPhotoHuntActivity.class); intent.putExtra("callbackMessenger", new Messenger(messageHandler)); startActivityForResult(intent, Constants.REQUEST_CREATE_NEW_PHOTO_HUNT); 发送的所有邮件都会转到我们的android.os.Messenger

步骤3,最后一步是从android.os.Handler创建一个android.os.Message,可以将其发送回处理程序。在我的问题的上下文中,这是在控制更新通知进度的对象内部完成的:

android.os.Messenger

所以,是的。如果您有Q,或者您发现我发布的错误,请随时发表评论。此外,我认为使用if(totalProgress >= 100) { notificationBuilder.setContentText("Upload complete! "); notificationBuilder.setSmallIcon(R.drawable.ic_done_black_24dp); notificationBuilder.setProgress(0, 0, false); notificationManager.notify(1, notificationBuilder.build()); Message msg = Message.obtain(); msg.arg1 = 1; try { callbackMessenger.send(msg); } catch (android.os.RemoteException e1) { Log.d(Constants.UploadProgressNotificationTag, e1.toString()); } } 也可以解决这个问题,但这需要更多的时间/精力来实现。感谢所有提出解决方案的人!