如果asInctask重新定义了doInBackground中的变量,那么asynctask是否会使应用程序崩溃

时间:2013-07-13 13:37:41

标签: android android-asynctask

我有这行代码

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

3 个答案:

答案 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(或onPreExecutiononProgressUpdate)来更新与UI线程共享的变量,因为您放入其中的代码将在UIThread。否则你可以使用synchronized / volatile。

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