我有这行代码
protected String doInBackground(String... args) {
//unnecessary geocoder calculations
strReturnedAddress = (returnedAddress.getLocality().toString());
}
}
}
return null;
}
它曾经工作过去2天,但今天,由于某种原因,我的应用程序不断崩溃,而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
答案 0 :(得分:0)
你可以在doInBackground上设置值,只要它们不是任何UI元素(例如textView.setText等),因为这些更改应该在UI线程上运行。 你看到的异常只是意味着returnedAddress为null或者returnAddress.getLocality()返回null ... 调试代码以更好地理解您面临的问题
答案 1 :(得分:0)
问题在于returnedAddress
变量,你可以处理这样的结果:
strReturnedAddress = returnedAddress == null || returnedAddress.getLocality() == null ?
"Not Found" : returnedAddress.getLocality().toString();
答案 2 :(得分:0)
问题应该在
中returnedAddress.getLocality().toString();
使用空变量shomewhere。
但是,如果您在某处的UI线程中使用strReturnedAddress
,则应该小心。正如您从logcat中看到的那样,doInBackground不会在UI线程上执行,而是在WorkerThread中执行。
如评论中所述,您应该使用onPostExecution
(或onPreExecution
,onProgressUpdate
)来更新与UI线程共享的变量,因为您放入其中的代码将在UIThread。否则你可以使用synchronized / volatile。
我还建议您注意AsyncTask,因为它可能无法执行,具体取决于JVM的当前状态和调用Activity。