java - 由于数据量巨大,AsyncTask 出现异常

标签 java android multithreading web-services android-asynctask

我正在从 Android 应用程序连接到 Java 中的 RESTful Web 服务。我正在使用 AsyncTask 来获取数据。它对于正常数据量来说非常有效。但是当我有大量数据时,Android应用程序中会发生异常。我试图捕获这个异常,但我不能:

private class LoadingDataFromServer extends AsyncTask<Void, Void, Void> {

        private boolean outOfMemory = false;

        @Override
        public void onPreExecute() {
            progress = ProgressDialog.show(main_activity, null,"Loading ...", true);
        }

        @Override
        protected void onPostExecute(Void result) {
            if(outOfMemory) {
                Toast.makeText(StatisticActivity.this, "Out of memory, select smaller criteria", Toast.LENGTH_SHORT).show();
                finish();
            }
            else
                setListView();
            try {
                progress.dismiss();
            } catch (Exception e) { }
        }

        @Override
        protected Void doInBackground(Void... params) {
            TextView txtProject = (TextView) main_activity.findViewById(R.id.project);
            txtProject.setBackgroundColor(Color.DKGRAY);
            txtProject.setText(project);

            TextView label = (TextView) main_activity.findViewById(R.id.label);
            label.setText(R.string.deliverable);
            try {
            loadStatistic();
            } catch (OutOfMemoryError e) {
                outOfMemory = true;
                progress.dismiss();
            } catch (RuntimeException e) {
                outOfMemory = true;
                progress.dismiss();
            } catch (Exception e) {
                outOfMemory = true;
                progress.dismiss();
            }
            return null;
        }
    }

这是我得到的错误:

10-14 22:24:10.952: ERROR/AndroidRuntime(4179): Uncaught handler: thread AsyncTask #3 exiting due to uncaught exception
10-14 22:24:10.962: ERROR/AndroidRuntime(4179): java.lang.RuntimeException: An error occured while executing doInBackground()
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at java.lang.Thread.run(Thread.java:1102)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at android.os.Handler.<init>(Handler.java:121)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at android.widget.Toast.<init>(Toast.java:68)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at android.widget.Toast.makeText(Toast.java:231)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at se.softwerk.timelog.statistic.StatisticActivity$LoadingDataFromServer.doInBackground(StatisticActivity.java:301)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at se.softwerk.timelog.statistic.StatisticActivity$LoadingDataFromServer.doInBackground(StatisticActivity.java:1)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
10-14 22:24:10.962: ERROR/AndroidRuntime(4179):     ... 4 more

异常发生在doInBackground中,但我的异常处理不起作用。你能帮我吗?

最佳答案

您应该从 onPreExecute() 中调用任何与 UI 相关的代码, onProgressUpdate(Progress... values)onPostExecute(Result result) (在主线程、UI 线程中运行),并使用 doInBackground(Params... params)仅执行 CPU 密集型操作。

调用publishProgress(Progress... values) doInBackground(Params... params)内将发送数据至onProgressUpdate(Progress... values) ,您可以在其中使用它来更新 UI。

关于java - 由于数据量巨大,AsyncTask 出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12886408/

相关文章:

java - Android开发中类与xml布局的通信

java - 使用插入排序修改快速排序

Java将整数转换为十六进制整数

应用程序崩溃时的android静态变量行为

c# - FileHelpers在调用engine.ReadNext()方法和readign engine.LineNumber属性之间的线程锁定问题

java - 如何使用 docker 构建 J2EE 应用程序

android - 如何在android代码中获取手机的电话号码?

android - 让第三方应用程序直接启动我的 Activity ?

c# - gRPC 间歇性地具有高延迟

ruby - 如何使用 Celluloid 从线程池运行 HTTP 请求?