java - Android Java 从后台线程中的异步任务返回结果

标签 java android multithreading design-patterns delegates

如何在后台任务中从 Java Android 中的 AsyncTask void onPostExecute() 方法返回结果? 当委托(delegate)模式拯救我的生命拯救我的生命时,我花了很多天的时间来寻找它。什么时候从 StackOverFlow 找到这里的。

我的主线程有一个 CsvUtil.getCompanies() 方法,需要返回一个列表,而 getCompanies() 调用一个 ReadLine 类,该类使用来自云端的 Google Sheet。

public static final class ParseLine extends AsyncTask<String, Integer, String[]> {
        private TaskDelegate delegate;

        public ParseLine(TaskDelegate delegate) {
            this.delegate = delegate;
        }

        public interface TaskDelegate {
            public void onTaskEndWithResult(String[] parseLine);
        }

        @Override
        protected String[] doInBackground(String... nextLine) {
            try {
                return parseLine(nextLine[0]);
            } catch (IOException ex) {
                Log.e("CsvReader", ex.getMessage());
            }
            return null;
        }

        @Override
        protected void onPostExecute(String[] parseLine) {
            if (parseLine != null && delegate != null)
                delegate.onTaskEndWithResult(parseLine);
        }
    }

private static final class GetNextLine extends AsyncTask<Void, Integer, String>
        implements ParseLine.TaskDelegate {

        private List<String[]> list;

        public GetNextLine(List<String[]> l) {
            list = l;
        }

        @Override
        protected String doInBackground(Void... companies) {
            try {
                return getNextLine();
            } catch (IOException ex) {
                Log.e("CsvReader", ex.getMessage());
            }
            return null;
        }

        @Override
        protected void onPostExecute(String nextLine) {
            if (nextLine != null) {
                ParseLine parseLine = new ParseLine(this);
                parseLine.execute(nextLine);
            }
        }

        @Override
        public void onTaskEndWithResult(String[] parseLine) {
            list.add(parseLine);
        }
    }

最佳答案

private static class BackgroundTask extends AsyncTask<Void, Void, Void>{

        private static WeakReference<MainActivity> activityRef ;

        public BackgroundTask(MainActivity activity){
            activityRef = new WeakReference<>(activity);
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            MainActivity activity = activityRef.get();

            if (activity != null && !activity.isFinishing()){
                //Talk to activity
            }
        }
    }

你可以这样做:

(我不完全理解你的问题,但是我在哪里发现你希望与 asyncTask 中的下划线 Activity 进行对话,如果你希望与 asyncTask 进行相反的 Activity ,你可以使用接口(interface)方法或模型 View 模型方法)

关于java - Android Java 从后台线程中的异步任务返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58885204/

相关文章:

java - 如何运行SpeakerIdentApp(MARF 示例)?

java - Java for Android 中的多个移动 Sprite

java - 通过android Volley使用PUT方法发送空体

android - 如何实现播放商店折叠工具栏布局?

java - 使用 JPA 条件 API 将条件表达式与 "AND"和 "OR"谓词组合

android - getDefaultSharedPreferences() - 多包应用程序的上下文是什么?

Android:将消息从后台线程传递到 UI 线程的正确方法?

c++ - 用户提供的 terminate() 函数必须是线程安全的吗?

multithreading - 是否多线程

java - 带有spring或java的骨架.Marionette.js完整教程