0

我有这行代码

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
4

3 回答 3

0

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

于 2013-07-13T13:50:13.470 回答
0

问题出在returnedAddress变量上,您可以像这样处理结果:

strReturnedAddress = returnedAddress == null || returnedAddress.getLocality() == null ? 
                     "Not Found" : returnedAddress.getLocality().toString();
于 2013-07-13T13:51:13.537 回答
0

问题应该是在

returnedAddress.getLocality().toString();

在某处使用空变量。

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

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

我还想建议您注意 AsyncTask,因为它可能不会执行,具体取决于 JVM 的当前状态和调用活动。

于 2013-07-13T22:34:03.547 回答