[英]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
(或onPreExecution
, onProgressUpdate
)来更新与UI线程共享的变量,因为放入其中的代码将在UIThread中运行。 否则,您可以使用同步/易失性。
我还建议您注意AsyncTask,因为它可能无法执行,具体取决于JVM和调用Activity的当前状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.