【问题标题】:How to send data from AsyncTask to Fragment如何将数据从 AsyncTask 发送到 Fragment
【发布时间】:2016-07-07 12:17:12
【问题描述】:

如何将数据从活动传递到片段。它有据可查,但不幸的是没有解决方案适合我。

我想将数据从我的主要活动中的内部 AsyncTask 类发送到另一个片段。

最受欢迎的答案是使用 Bundle,所以我尝试了以下方法:

异步任务:

Bundle bundle = new Bundle();
bundle.putString("test", "From AsyncTask");

MyFragmentClass fragobj = new MyFragmentClass();
fragobj.setArguments(bundle);

片段:

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

rootView = inflater.inflate(R.layout.fragment_one, container, false);

String value = getArguments().getString("test");
Log.i("valueTest", value);

return rootView;

}

当我收到以下内容时,字符串没有被传递给片段:

“java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.lang.String android.os.Bundle.getString(java.lang.String)'”

我将不胜感激。

【问题讨论】:

  • 你的 AsyncTask 代码是什么?
  • 确保您没有在 FragmentTransaction 中添加不同的 MyFragmentClass 实例。此外,您共享的代码本身会出错。您还没有在这里关闭双引号:bundle.putString("test", "From AsyncTask);
  • 感谢您的建议 Cgx 解决方案有效

标签: android android-fragments android-asynctask android-bundle


【解决方案1】:

当然你不能得到 bundle ,因为创建片段和从 AsyncTask 获取是异步的)。所以你可以在 asyncTask 完成时使用 BroadCastReceiver 来接收数据; 片段:

 @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.layout_demo, container, false);
    //to register br
    initBroadCastReceiver();
    return view;
}

private void initBroadCastReceiver() {
    manager = LocalBroadcastManager.getInstance(getContext());
    MyBroadCastReceiver receiver = new MyBroadCastReceiver();
    IntentFilter filter = new IntentFilter();
    //whatever
    filter.addAction("com.action.test");
    manager.registerReceiver(receiver,filter);
}

class MyBroadCastReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        //e.g
        String key = intent.getStringExtra("key");
    }
}

asyncTask->onPostExcute()

Intent intent = new Intent("com.action.test");
    intent.putExtra("key","123");
    manager.sendBroadcast(intent);

【讨论】:

  • 感谢您的帮助。你的解决方案奏效了。我只需要添加 manager = LocalBroadcastManager.getInstance(getApplicationContext());到 asyncTask。
【解决方案2】:

在你的 onCreateView 中试试这个

Bundle b = getActivity().getIntent().getExtras();
    if(b != null) {
        String test = b.getString("test");
    }

这也有助于解决空指针错误

【讨论】:

  • 这只会处理NullPointerException。它不能解决数据没有被传递的问题。
  • 谢谢,Cgx 的建议解决了这个问题。
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多