【问题标题】:AlertDialog an webview in AsynctaskAsynctask 中的 AlertDialog 一个 webview
【发布时间】:2014-08-04 22:14:53
【问题描述】:

我正在尝试在 AsyncTask doInBackground 中运行此代码,但在应用程序关闭并在日志中向我抛出了一个错误,这并不意味着。

AlertDialog 的早期执行是在 OnPostExecute 函数中执行的,但我发出警告:“应用程序可能在其主线程上做太多工作。”有时应用程序已关闭。

出于这个原因,我决定在 doInBackground 中这样做,但正如我上面所写的,我收到了一个错误,但这并不意味着。

有什么帮助吗?

谢谢

功能:

//AsyncTask para insertar Personas
        class Insertar extends AsyncTask<String,String,String>{

            private Activity context;

            Insertar(Activity context){
                this.context=context;
            }
            @Override
            protected String doInBackground(String... params) {
              // TODO Auto-generated method stub


              String result = insertar();

              if ( result.equals("0") ){

                    AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); 
                    alert.setTitle("Dona1Click - Patrocinador");

                    alert.setMessage("Lo sentimos, ha excedido el limite diaro de 20 clicks");

                    alert.setNegativeButton("Close", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.dismiss();
                        }
                    });

                    alert.show();


                }


                if ( result.equals("1") ){

                    AlertDialog.Builder alert = new AlertDialog.Builder(getActivity()); 
                    alert.setTitle("Dona1Click - Patrocinador");


                    WebView wv = new WebView(getActivity());
                    wv.loadUrl("http:\\www.google.com");
                    wv.setWebViewClient(new WebViewClient() {

                        public void onPageFinished(WebView view, String url) {
                            if(pd.isShowing()&&pd!=null)
                            {
                                pd.dismiss();
                            }
                        }


                        @Override
                        public boolean shouldOverrideUrlLoading(WebView view, String url) {
                            view.loadUrl(url);

                            return false;
                        }
                    });

                    alert.setView(wv);
                    alert.setNegativeButton("Close", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.dismiss();
                        }
                    });

                    alert.show();

                 // Para colocar un loading

                    pd = ProgressDialog.show(getActivity(), "", "Loading...",true);

                    //--------------------------



                }



              return null;
            }


            @Override
            protected void onPostExecute(String result) {


            }

日志:

08-04 18:01:12.221: D/dalvikvm(1229): GC_FOR_ALLOC freed 39K, 5% free 2808K/2928K, paused 82ms, total 86ms
08-04 18:01:12.221: I/dalvikvm-heap(1229): Grow heap (frag case) to 4.604MB for 1872016-byte allocation
08-04 18:01:12.391: D/dalvikvm(1229): GC_FOR_ALLOC freed <1K, 3% free 4636K/4760K, paused 145ms, total 145ms
08-04 18:01:13.381: D/gralloc_goldfish(1229): Emulator without GPU emulation detected.
08-04 18:01:18.251: D/dalvikvm(1229): GC_FOR_ALLOC freed 94K, 4% free 4863K/5040K, paused 356ms, total 359ms
08-04 18:01:18.251: I/dalvikvm-heap(1229): Grow heap (frag case) to 5.431MB for 635812-byte allocation
08-04 18:01:18.481: D/dalvikvm(1229): GC_FOR_ALLOC freed <1K, 4% free 5483K/5664K, paused 222ms, total 222ms
08-04 18:01:19.551: I/ActionBar(1229): null seleccionada.
08-04 18:01:19.951: D/dalvikvm(1229): GC_FOR_ALLOC freed 11K, 3% free 5571K/5704K, paused 311ms, total 315ms
08-04 18:01:19.961: I/dalvikvm-heap(1229): Grow heap (frag case) to 7.714MB for 2304016-byte allocation
08-04 18:01:20.231: D/dalvikvm(1229): GC_FOR_ALLOC freed <1K, 2% free 7821K/7956K, paused 269ms, total 269ms
08-04 18:01:23.321: I/Choreographer(1229): Skipped 70 frames!  The application may be doing too much work on its main thread.
08-04 18:01:23.851: I/Choreographer(1229): Skipped 42 frames!  The application may be doing too much work on its main thread.
08-04 18:01:26.331: V/WebViewChromium(1229): Binding Chromium to the background looper null
08-04 18:01:26.331: W/dalvikvm(1229): threadid=11: thread exiting with uncaught exception (group=0xb3aa1ba8)
08-04 18:01:26.361: E/AndroidRuntime(1229): FATAL EXCEPTION: AsyncTask #1
08-04 18:01:26.361: E/AndroidRuntime(1229): Process: com.example.dona1click, PID: 1229
08-04 18:01:26.361: E/AndroidRuntime(1229): java.lang.RuntimeException: An error occured while executing doInBackground()
08-04 18:01:26.361: E/AndroidRuntime(1229):     at android.os.AsyncTask$3.done(AsyncTask.java:300)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at java.lang.Thread.run(Thread.java:841)
08-04 18:01:26.361: E/AndroidRuntime(1229): Caused by: java.lang.NullPointerException
08-04 18:01:26.361: E/AndroidRuntime(1229):     at android.os.Handler.<init>(Handler.java:229)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at android.os.Handler.<init>(Handler.java:137)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at com.android.org.chromium.base.ThreadUtils.setUiThread(ThreadUtils.java:34)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at com.android.webview.chromium.WebViewChromiumFactoryProvider.ensureChromiumStartedLocked(WebViewChromiumFactoryProvider.java:104)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at com.android.webview.chromium.WebViewChromiumFactoryProvider.startYourEngines(WebViewChromiumFactoryProvider.java:259)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at com.android.webview.chromium.WebViewChromium.init(WebViewChromium.java:218)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at android.webkit.WebView.<init>(WebView.java:508)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at android.webkit.WebView.<init>(WebView.java:475)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at android.webkit.WebView.<init>(WebView.java:455)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at android.webkit.WebView.<init>(WebView.java:444)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at android.webkit.WebView.<init>(WebView.java:434)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at com.example.dona1click.Donar$Insertar.doInBackground(Donar.java:178)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at com.example.dona1click.Donar$Insertar.doInBackground(Donar.java:1)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at android.os.AsyncTask$2.call(AsyncTask.java:288)
08-04 18:01:26.361: E/AndroidRuntime(1229):     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
08-04 18:01:26.361: E/AndroidRuntime(1229):     ... 4 more
08-04 18:01:27.891: I/Choreographer(1229): Skipped 344 frames!  The application may be doing too much work on its main thread.
08-04 18:01:30.671: I/Choreographer(1229): Skipped 62 frames!  The application may be doing too much work on its main thread.
08-04 18:01:32.691: I/Process(1229): Sending signal. PID: 1229 SIG: 9

【问题讨论】:

  • 你检查 NullPointerException 了吗?

标签: android android-asynctask


【解决方案1】:

您无法更改doInBackground 中的任何视图,为此您必须使用onProgressUpdateonPostExecute

【讨论】:

  • 如果我在 onPostExecute 中更改视图会出现:应用程序可能在其主线程上做太多工作。
【解决方案2】:

您不能在后台线程上执行 UI 操作。您必须对 onProgressUpdate 或 onPostExecute 进行 UI 操作。要使用 OnProgressUpdate,您必须通过调用 publishProgress() 来调用 onProgressUpdate;来自doInBackground。

但是有一个方法runOnUiThread。这个Link 解释如何使用它。

【讨论】:

  • 如果我在 onPostExecute 中执行 UI 操作会出现:应用程序可能在其主线程上做太多工作。
  • 您在那里编写的代码应该在主线程上,因为它们正在处理 UI 操作。但是,如果您的应用程序正在使用位图或网络操作,则可以在 Async Task 中编写。如果您的应用程序经常被强制关闭,您可以设置 largeHeap = "true";在应用程序标记下的清单文件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多