Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android fragments 将数据从MainActivity中的AsyncTask发送到Fragment?_Android Fragments_Android Asynctask - Fatal编程技术网

Android fragments 将数据从MainActivity中的AsyncTask发送到Fragment?

Android fragments 将数据从MainActivity中的AsyncTask发送到Fragment?,android-fragments,android-asynctask,Android Fragments,Android Asynctask,我一整天都在寻找解决办法。但没有解决办法奏效 我的main活动中有AsyncTask。在main活动中我在ViewPager中有两个片段 我想从MainActivity的AsyncTask向这两个片段发送JSON字符串 当我尝试以片段形式接收字符串时,问题就出现了 我在创建的活动和创建的视图中尝试了它 我尝试过的解决方案是: 通过bundle参数接收 Bundle bundle = this.getArguments(); result = bundle.getString("json"); r

我一整天都在寻找解决办法。但没有解决办法奏效

我的
main活动中有
AsyncTask
。在
main活动中
我在
ViewPager中有两个片段

我想从MainActivity的AsyncTask向这两个片段发送JSON字符串

当我尝试以片段形式接收字符串时,问题就出现了

我在创建的活动和创建的视图中尝试了它

我尝试过的解决方案是:

通过bundle参数接收

Bundle bundle = this.getArguments();
result = bundle.getString("json");
result = getArguments().getString("json");
通过返回全局变量(结果)的函数进行接收-

MainActivity activity = (MainActivity) getActivity();
result = activity.getMyData();

我还尝试实现Communicator,但我没有标记或ID链接到activity_main.xml中的片段

异步任务完成后,您需要传递回调

public interface TaskListener{
    public void onResultAvailable(Result result);
}

private MyTask extends AsyncTask{
    private List<TaskListener> myListeners = new ArrayList<TaskListener>();

    public void addListener(TaskLister tl){
        myListeners.add(tl);
    }
    @Override
    protected void onPostExecute(Result result){
        super.onPostExecute(result).
        for(TaskListener tl : myListeners){
            tl.onResultAvailable(result);
        }
        myListeners.clear();
    }
}
现在有了一个frament,它可以处理AsyncTask结果,但它还必须“订阅”AsyncTask。因此,您可以在执行任务之前将片段作为侦听器添加到任务中

public class MainActivity extends Something{

    public void onStart(){
        MyFragment fragment = findFragment();

        MyTask task = createTask();
        task.addListener(fragment);

        execute(task);
    }
}

在过去的6-7天里,我尝试了几乎所有可能的在线解决方案。经过长时间的研究和尝试,我能够自己解决我的问题。(奇怪的是,这里没有得到太多的回应)

我使用了
List
并将片段创建为
fragments=newvector()。我在
onPostExecute()
中接收到来自
AsyncTask
的结果后添加了片段,并通过此方法将我的字符串参数以捆绑方式传递

public static Fragment instantiate (Context context, String fname, Bundle args)
然后我通过
onCreateView
方法中的
getArguments()
在两个片段中接收到参数

我做我需要做的事。谢谢你的回答,我希望这个答案能帮助别人


我意识到,问题在于,接收和访问从MainActivity传递的数据时,无论数据是来自接口方法还是片段内的公共方法,这些片段是从MainActivity中相同片段的对象调用的。所有这些解决方案都抛出了NullPointerException。

AsyncTask做什么,什么时候做?它是在创建片段之前执行的吗?我已经尝试过两种方式执行它,在创建片段之前和之后。AsyncTask从链接获取json值。然后将它们传递给片段。它是否像通信器接口一样工作?我从未见过或使用过这个。你能再描述一下吗?我是初学者。在将其放入MainActivity后,是否需要从片段调用其函数?这不是一个类或组件,它是android sdk的一部分。我使用了一种非常常见的软件设计模式:[观察者]。我将在示例中详细介绍……我现在已经开始理解这一点。但是我不明白您在MainActivity的onStart()中做了什么。我不知道,在MainActivity的生命周期中,异步任务是在什么时候启动的。我猜这是在onStart()期间发生的,因此我将任务的创建和执行放在那里。findFragment()方法只是一个占位符,您可以在其中从视图中调用片段。execute()方法是一个占位符,用于启动任务执行。它的意思是像伪代码一样,以您喜欢的方式执行实际的实现。重要的代码行是task.addListener(fragment);是的,我抓到你了。现在,实现这一点仍然存在一个问题。如何找到碎片?正如我提到的,我在activity_main中没有任何标记,因为我是通过ViewPage和FragmentStatePagerAdapter类实现它的。我还有两个片段布局。谢谢你的帮助。我知道我要求很多。
public static Fragment instantiate (Context context, String fname, Bundle args)