从另一个 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