如何将异步任务结果传递给另一个活动?

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 时才保存。 已更新,请查收。 谢谢!我需要重构代码,但这有帮助。

以上是关于如何将异步任务结果传递给另一个活动?的主要内容,如果未能解决你的问题,请参考以下文章

将异步结果从父组件传递给子组件反应功能组件

将 CurrentUICulture 传递给 ASP.NET MVC 3.0 中的异步任务

使用celery的backend异步获取结果

从异步任务中获取 LatLngs

活动丢失后终止异步任务

Swift:带有异步 Web 任务的活动指示器