无法将数据从 asyncTask 传递到我的活动

Posted

技术标签:

【中文标题】无法将数据从 asyncTask 传递到我的活动【英文标题】:Cannot pass data from asyncTask to my activity 【发布时间】:2016-05-18 14:50:29 【问题描述】:

在searchactivity中:我声明了一个后台工作类来连接远程mysql数据库并获取一些数据

protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);

    BackgroundWorker worker = new BackgroundWorker(SearchActivity.this);
    worker.execute("Searchfirst");
    ////////// My message is empty below
Toast.makeText(SearchActivity.this,getIntent().getExtras().getString("searchresult"),Toast.LENGTH_SHORT).show();

在 backgroundworker.class 中,backgroundworker 类确实获得了数据但未能传递给我的活动

protected void onPostExecute(Wrapper w) 
    else if(w.result.contains("Searchfirst successfully!"))
        ////////// My message can be showed correctly here
Toast.makeText(context,w.result.toString(),Toast.LENGTH_SHORT).show(); 
        Intent colleges = new Intent(context,SearchActivity.class);
        colleges.putExtra("searchresult", w.result);
    

我还发现,如果我将数据放入意图并通过在 onPostExecute() 中调用 startActivity(intent) 立即启动该活动,则数据可以传递给该意图,但是,如果我没有启动该活动,数据丢失了?

【问题讨论】:

创建一个Intent 并在其中添加一个额外的内容并不会神奇地将这些数据发送到您的活动。通常,您使用带有回调的接口将数据发送回活动或任何对结果感兴趣的对象,如 here 所示。 其实我之前看过你的链接,但是每次我测试它都会出现另一个问题。 还有什么问题? 很难说,就像我尝试实现登录和登录工作,但我的注册活动然后崩溃了。 你可以查看logcat的输出看看它崩溃的原因。 【参考方案1】:

您可以添加以下行:

Intent intent = new Intent("myAction");
intent.putExtra("searchResult", w.result);
sendBroadcast(intent);

然后在您的活动中注册广播接收器:

registerReceiver(new BroadcastReceiver() 
            @Override
            public void onReceive(Context context, Intent intent) 
                Object result = intent.getExtras().get("searchResult");
            
        , new IntentFilter("myAction"));

此外,您可以定义一个监听器接口并将其传递给异步任务,然后在 onPostExecute() 方法中调用监听器的方法。无需以这种方式调用意图。

【讨论】:

这是我不想开始新活动的问题。 这有什么帮助? OP 提到 startActivity 已被使用并尝试使用回调接口但无法使其工作...... @KKK 调用 startActivity(intent) 并不总是开始一个新的活动。您可以使用该意图过滤器向所有接收者广播意图。我更新了我的答案 对于接口监听器方法,我应该在哪里编写代码来验证来自 asynctask 的数据并做其他事情?在activity中实现接口的方法中?我应该在哪里调用这个方法? @Shayan_Aryan 你是从哪里想到只用一个动作调用startActivity 会触发一个广播接收器监听那个动作的?

以上是关于无法将数据从 asyncTask 传递到我的活动的主要内容,如果未能解决你的问题,请参考以下文章

无法将值传递给Android中的AsyncTask

如何将数据从异步类传递到主活动类

Android - 将数据从 AsyncTask 传递到 Activity

onPostExecute() 无法重新运行从活动调用的 asyncTask

带有进度条的Firebase数据库

如何将数据从 Intent 传递到 Fragment