【问题标题】:Android Java Return Result from Async Task in Background ThreadAndroid Java 从后台线程中的异步任务返回结果
【发布时间】:2019-11-15 21:54:53
【问题描述】:

如何在后台任务中从 Java Android 中的 AsyncTask void onPostExecute() 方法返回结果? 当 Delegate Pattern Save My Life 救了我的命时,我花了很多天来搜索它。什么时候从 StackOverFlow 在这里找到的。

我的主线程有一个 CsvUtil.getCompanies() 方法需要返回一个 List,getCompanies() 调用一个 ReadLine 类来使用来自 Cloud 的 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);
        }
    }

【问题讨论】:

  • 什么时候需要使用后台任务和委托模式?
  • onPostExecute 在 UI 线程上被调用,它基本上是一个回调,当doInBackground 完成时调用,不管有没有结果。不清楚你想在这里实现什么。
  • 所以,我需要将结果从 void onPostExecute 返回到我的主线程,从两个后台线程传递。
  • 如果您启动 2 AsyncTasks,那么两者都会在他们的 onPostExecute 方法中为您提供结果。在那里你可以得到你的结果并更新 UI。

标签: java android multithreading design-patterns delegates


【解决方案1】:
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 中的下划线活动交谈,如果您希望与 asyncTask 进行相反的活动,您可以使用界面方法或模型视图模型方法)

【讨论】:

  • 我有 2 个后台线程互相传递结果,所以我怀疑何时使用委托模式以及是否建议使用 2 个后台线程。
猜你喜欢
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 2021-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多