从另一个 Activity 类执行 Fragment 中的 AsyncTask 并更新其中的 UI

Posted

技术标签:

【中文标题】从另一个 Activity 类执行 Fragment 中的 AsyncTask 并更新其中的 UI【英文标题】:Execute AsyncTask in Fragment from another Activity class and update UI inside it 【发布时间】:2021-01-23 00:19:30 【问题描述】:

我正在尝试从另一个 Activity 类 (e.g MyActivity.java) 的片段类 (e.g MyFragment.java) 执行 AsyncTask

片段类 MyFragment.java 正在更新其元素的 UI:

public class MyFragment extends Fragment 

    private SwipeRefreshLayout myRefreshLayout;
    private ArrayAdapter myListAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState)  super.onCreate(savedInstanceState); 

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
        myListAdapter = new myCustomAdapter(getContext(), myDataArray);
        myRefreshLayout = myView.findViewById(R.id.myRefreshLayout);
    

    public class MyTask extends AsyncTask<Void, Void, Void> 
        @Override
        protected void onPreExecute() 
            super.onPreExecute();

            // UI...
            myRefreshLayout.setRefreshing(true);
        

        @Override
        protected void onPostExecute(Void result) 
            super.onPostExecute(result);

            // UI...
            myRefreshLayout.setRefreshing(false);
            myListAdapter.notifyDataSetChanged();
        

         @Override
        protected Void doInBackground(Void... params) 

            // code...
            return null;
        
    

我正在尝试从 MyActivity.java 执行 AsyncTask

MyFragment myfragment = new MyFragment();
myfragment.new MyTask.execute();

应用程序在onPreExecute崩溃

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void androidx.swiperefreshlayout.widget.SwipeRefreshLayout.setRefreshing(boolean)”。

我假设这是因为它无法访问myRefreshLayout 以对其执行setRefreshing(true),因为我正在从另一个线程MyActivity.java 运行任务

如何从 Activity 执行 Fragment 上的 AsyncTask 并更改 UI?

谢谢。

【问题讨论】:

【参考方案1】:

如果这将是一个不错的解决方案,我想知道。但我认为你可以让 MainActivity 实现这个自定义接口。这将是一个应该在滑动操作完成后执行的回调。

public class MainActivity extends AppCompatActivity implements MyAsyncCallback 
    ....
    ....

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyFragment myfragment = new MyFragment();
        myfragment.new MyTask(this).execute();
    

    @Override
    public void onPreExecute(Boolean isRefreshing) 
        if(isRefreshing)
            // UPDATE MAIN UI
        
    
 
    @Override
    public void onPostExecute(Boolean isRefreshing) 
       if(isRefreshing)
            // UPDATE MAIN UI
        
     


interface MyAsyncCallback 
    void onPreExecute(Boolean isRefreshing);
    void onPostExecute(Boolean isRefreshing);

在你的片段中

public class MyTask extends AsyncTask<Void, Void, Void> 
    WeakReference<MyAsyncCallback> myListener;

    public MyTask(MyAsyncCallback listener)
        this.myListener = listener
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
    Bundle savedInstanceState) 
       // don't forget to return view
    

    @Override
    protected void onPreExecute() 
        super.onPreExecute();
        
        MyAsyncCallback myListener = this.myListener.get();
        if (myListener != null) 
            myListener.onPreExecute(true);
        

        myRefreshLayout.setRefreshing(true);
    

    //same for onPostExecute()

【讨论】:

问题是关于更新片段上的 UI 元素而不是 mainactivity,正如我在从 mainactivity 调用 asyncTask 时所说的那样。片段上的 UI 元素会抛出错误,因为它们将不可用当呼叫来自片段外部时更新。我描述了the fragment class MyFragment.java is updating UI on it's elements : ..您提供了一个使用异步任务回调的非常好的示例,这可能对其他情况有所帮助!谢谢maftu!

以上是关于从另一个 Activity 类执行 Fragment 中的 AsyncTask 并更新其中的 UI的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个类(它扩展了 Activity)方法,Android 调用 CCColorLayer 类的方法?

gitee查询用户名和密码 Android Studio 3.5以上版本新特性 sharePreferences 使用 不同的Activity间的preferences共享问题 Fragmen

Fragmen直接来回切换deno

从另一个Activity更新TextView

安卓第十天笔记-fragment

从另一个 Activity 访问一个 Activity 中的小部件