繁体   English   中英

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

[英]Execute AsyncTask in Fragment from another Activity class and update UI inside it

我正在尝试从另一个活动 class (eg MyActivity.java)的片段 class (eg MyFragment.java)执行AsyncTask

片段 class 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) ' 在 null object 参考上。

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

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

谢谢。

不知道这是否是一个很好的解决方案。 但我认为你可以让 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM