【问题标题】:Execute AsyncTask in Fragment from another Activity class and update UI inside it从另一个 Activity 类执行 Fragment 中的 AsyncTask 并更新其中的 UI
【发布时间】: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?

谢谢。

【问题讨论】:

    标签: java android android-fragments android-asynctask


    【解决方案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!
    猜你喜欢
    • 2014-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多