如何将异步任务结果传递给另一个活动?
Posted
技术标签:
【中文标题】如何将异步任务结果传递给另一个活动?【英文标题】:How to pass an AsyncTask's result to another Activity? 【发布时间】:2021-02-17 13:46:37 【问题描述】:我怎样才能获得 AsyncTask 的结果来启动另一个活动? 这个 AsyncTask 似乎很不舒服...... 现在,在 onPostExecute 完成之前,它会在没有结果的情况下启动活动。 这怎么能等到它完成而不必重写整个代码?
public class MainFragment extends Fragment implements InsertAsyncTask.AsyncInsertTaskCompleteListener
private Repository mRepository;
private String data;
private int codeId;
private int editMode = 0;
private Context mContext;
private FragmentMainBinding binding;
@Override
public void onCreate(@Nullable Bundle savedInstanceState)
super.onCreate(savedInstanceState);
mContext = this.getContext();
mRepository = new Repository(mContext);
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
return inflater.inflate(R.layout.mainfragment, container, false);
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState)
super.onViewCreated(view, savedInstanceState);
binding = FragmentMainBinding.bind(view);
binding.createFormSaveButton.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
String text = binding.codeCreateFormTextInput.getText().toString().trim();
if (!text.equals(""))
create("save data");
Intent intent = new Intent(mContext.getApplicationContext(), NextActivity.class);
intent.putExtra("code_id", codeId);
mContext.startActivity(intent);
private void create(String data)
if (editMode == 1)
//updated data to DB
updateCode(data);
else
//save data to DB
save(data);
public void save(String data)
mRepository.insertTask(data, MainFragment.this);
@Override
public void onInsertTaskComplete(long[] id)
if (id[0] > 0)
codeId = (int) id[0];
Repository.java:
public void insertTask(String data, InsertAsyncTask.AsyncInsertTaskCompleteListener mListener)
new InsertAsyncTask(myDatabase.getCDao(), mListener).execute(data);
插入AsyncTask.java:
public class InsertAsyncTask extends AsyncTask<String, Void, Long>
private static final String TAG = "InsertAsyncTask";
private cDao mCDao;
private AsyncInsertTaskCompleteListener callback;
private long[] insertId;
public InsertAsyncTask(CDao dao, AsyncInsertTaskCompleteListener cb)
mCDao = dao;
this.callback = cb;
@Override
protected void onPostExecute(Long aLong)
super.onPostExecute(aLong);
if (callback != null)
callback.onInsertTaskComplete(insertId);
@Override
protected Long doInBackground(String... datas)
insertId = mCDao.insertCode(datas);
return null;
public interface AsyncInsertTaskCompleteListener
void onInsertTaskComplete(long[] id);
【问题讨论】:
我个人建议找点别的东西来使用,异步任务有点过时了(据我所知)它们实际上已经被弃用了 是的,很遗憾我知道。你会建议在 Java 中使用什么,我将它与 Room 一起使用,直到我完全学习 Kotlin。但现在我需要这个才能开始工作。 【参考方案1】:将顶部codeId
的值初始化为
private int codeId = -1;
然后在onViewCreated
内将条件更改为:
if (codeId != -1)
create("save data");
Intent intent = new Intent(mContext.getApplicationContext(), NextActivity.class);
intent.putExtra("code_id", codeId);
mContext.startActivity(intent);
现在应该可以正常工作了。
【讨论】:
我忘了说这个 create() 方法是在一个按钮点击监听器中: binding.createFormSaveButton.setOnClickListener(... create("save data"); );这就是为什么它是一个问题。 除非您的 codeId 未设置,否则请勿保存。因此,对于那个初始化 codeId = -1 并且在你的点击监听器中只有当它不等于 -1 时才保存。 已更新,请查收。 谢谢!我需要重构代码,但这有帮助。以上是关于如何将异步任务结果传递给另一个活动?的主要内容,如果未能解决你的问题,请参考以下文章