繁体   English   中英

如果asynctask重新定义doInBackground中的变量,它将使应用程序崩溃

[英]Will an asynctask crash an app if it redefines a variable inside doInBackground

我有这行代码

protected String doInBackground(String... args) {

            //unnecessary geocoder calculations

               strReturnedAddress = (returnedAddress.getLocality().toString());
        }
                }
            }


        return null;
    }

它过去工作了两天,但是今天,由于某种原因,我的应用程序不断崩溃,logcat将这一行显示为错误的来源。 当我删除此行时,应用程序不会崩溃。

我是否应该创建一个新字符串并从doInBackground方法返回它,并在onPostExecute中设置strReturnedAddress? 我真的很无能为力,因为这在昨天晚上才奏效。

编辑:这是logcat

   07-13 16:43:57.480: E/AndroidRuntime(28027): FATAL EXCEPTION: AsyncTask #5
07-13 16:43:57.480: E/AndroidRuntime(28027): java.lang.RuntimeException: An error occured while executing doInBackground()
07-13 16:43:57.480: E/AndroidRuntime(28027):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
07-13 16:43:57.480: E/AndroidRuntime(28027):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
07-13 16:43:57.480: E/AndroidRuntime(28027):    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
07-13 16:43:57.480: E/AndroidRuntime(28027):    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
07-13 16:43:57.480: E/AndroidRuntime(28027):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
07-13 16:43:57.480: E/AndroidRuntime(28027):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
07-13 16:43:57.480: E/AndroidRuntime(28027):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
07-13 16:43:57.480: E/AndroidRuntime(28027):    at java.lang.Thread.run(Thread.java:856)
07-13 16:43:57.480: E/AndroidRuntime(28027): Caused by: java.lang.NullPointerException
07-13 16:43:57.480: E/AndroidRuntime(28027):    at com.example.realapptest1.MainActivity$GetCurrentCity.doInBackground(MainActivity.java:407)
07-13 16:43:57.480: E/AndroidRuntime(28027):    at com.example.realapptest1.MainActivity$GetCurrentCity.doInBackground(MainActivity.java:1)
07-13 16:43:57.480: E/AndroidRuntime(28027):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
07-13 16:43:57.480: E/AndroidRuntime(28027):    at java.util.concurrent.FutureTask.run(FutureTask.java:234)
07-13 16:43:57.480: E/AndroidRuntime(28027):    ... 4 more

您绝对可以在doInBackground上设置值,只要它们不是任何UI元素(例如textView.setText等),因为这些更改应该在UI线程上运行。 您看到的异常仅意味着returnAddress为null或returnAddress.getLocality()返回null ...调试代码以更好地了解您面临的问题

问题在于returnedAddress变量,您可以处理如下结果:

strReturnedAddress = returnedAddress == null || returnedAddress.getLocality() == null ? 
                     "Not Found" : returnedAddress.getLocality().toString();

问题应该是

returnedAddress.getLocality().toString();

用于空变量shomewhere。

但是,如果您在某处的UI线程中使用strReturnedAddress ,则应小心。 如您从logcat中看到的,doInBackground不在UI线程上执行,而是在WorkerThread中执行。

如评论中所述,您应该使用onPostExecution (或onPreExecutiononProgressUpdate )来更新与UI线程共享的变量,因为放入其中的代码将在UIThread中运行。 否则,您可以使用同步/易失性。

我还建议您注意AsyncTask,因为它可能无法执行,具体取决于JVM和调用Activity的当前状态。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM