On Sep 21, 6:11 pm, "Mark Murphy" <[email protected]> wrote:
> > I made an example that sleeps inside the Runnable. The entire WebView
> > becomes unresponsive! What is the proper way (if any) of implementing
> > a long-running JavaScript call?
>
> Everything is fine except for sleeping in the Runnable. The Runnable is
> run on the UI thread -- sleeping on the UI thread, like sleeping on the
> job, is not a good idea.
>
> If you want something that will run for a long time, use a background
> thread, perhaps in the form of an AsyncTask.

Thanks for the tip. I forgot that the Handler executes Runnables on
the UI thread. I thought instead that it was like an Executor.

> > Is it safe to call loadUrl() from multiple threads?
>
> I have not tried it, but I doubt it. If you use AsyncTask, do your
> loadUrl() in onPostExecute().

I found that loadUrl() is not safe to be called using AsyncTask.
onPostExecute() is not called by the "main" thread, but by
"WebViewCoreThread".
This breaks if a text box is in use, which needs to run in "main."

The solution is to manually use a Handler.

09-22 20:01:19.943: ERROR/AndroidRuntime(768): Uncaught handler:
thread WebViewCoreThread exiting due to uncaught exception
09-22 20:01:20.113: ERROR/AndroidRuntime(768): android.view.ViewRoot
$CalledFromWrongThreadException: Only the original thread that created
a view hierarchy can touch its views.
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.view.ViewRoot.checkThread(ViewRoot.java:2440)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.view.ViewRoot.invalidateChild(ViewRoot.java:522)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:540)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.view.ViewGroup.invalidateChild(ViewGroup.java:2332)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.view.View.invalidate(View.java:4437)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.view.View.onFocusChanged(View.java:2428)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.widget.TextView.onFocusChanged(TextView.java:6211)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.widget.AutoCompleteTextView.onFocusChanged
(AutoCompleteTextView.java:767)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.view.View.clearFocusForRemoval(View.java:2346)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.view.ViewGroup.removeViewInternal(ViewGroup.java:2034)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.view.ViewGroup.removeViewInternal(ViewGroup.java:2027)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.view.ViewGroup.removeView(ViewGroup.java:1975)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.webkit.TextDialog.remove(TextDialog.java:395)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.webkit.WebView.clearTextEntry(WebView.java:1374)
09-22 20:01:20.113: ERROR/AndroidRuntime(768):     at
android.webkit.WebView.loadUrl(WebView.java:1116)

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to