【问题标题】:Error:while loading doInBackground()错误:加载 doInBackground() 时
【发布时间】:2015-08-26 12:38:18
【问题描述】:

在加载 doInBackground 方法时 Asynctask 出现致命异常。我该如何解决这个问题。

这是 OnCreate 方法:

                super.onCreate(savedInstanceState);
                setContentView(R.layout.single_list_item);
                reload();
                Intent in = getIntent();
                this.link = in.getStringExtra("link");
                String link = in.getStringExtra(KEY_LINK);
                this.web = (WebView) findViewById(R.id.webView1);
                TextView Desc = (TextView) findViewById(R.id.description_label);
                loadStuff localloadStuff = new loadStuff();
                String[] arrayofString = new String[1];
                arrayofString[0] = this.link;
                localloadStuff.execute(arrayofString);

这是 Asyntask 类:

            public class loadStuff extends AsyncTask<String, Void, Void> {
                    public loadStuff() {
                    }
                    @Override
                    protected Void doInBackground(String... params) {
                        SingleItemActivity.this.link = SingleItemActivity.this.link
                                .replace("http://www.", "http://m.");
                        SingleItemActivity.this.web.getSettings()
                                .setJavaScriptEnabled(true);
                        SingleItemActivity.this.web.loadUrl(SingleItemActivity.this.link);
                        SingleItemActivity.this.web.setWebViewClient(new WebViewClient());
                        return null;
                    }

LogCat 错误:

    08-26 18:33:35.753: E/AndroidRuntime(14945): FATAL EXCEPTION: AsyncTask #1
    08-26 18:33:35.753: E/AndroidRuntime(14945): Process: com.example.sliding_activity, PID: 14945
    08-26 18:33:35.753: E/AndroidRuntime(14945): java.lang.RuntimeException: An error occured while executing doInBackground()
    08-26 18:33:35.753: E/AndroidRuntime(14945):    at android.os.AsyncTask$3.done(AsyncTask.java:300)
    08-26 18:33:35.753: E/AndroidRuntime(14945):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)

【问题讨论】:

  • 请先编辑您的问题

标签: android android-asynctask


【解决方案1】:

您正试图在 doInBackground() 方法中访问 webview。你不能在 doInBackground() 中做任何 UI 工作。如果你这样做,它会失败。

参考此链接:java.lang.RuntimeException: An error occured while executing doInBackground()

【讨论】:

    【解决方案2】:

    您实际上并不需要 AsyncTask 来执行此操作。 您遇到的问题是您正在尝试从后台线程更新 UI 线程。 事实上,你可以简单地写这个并且会工作

    super.onCreate(savedInstanceState);
    setContentView(R.layout.single_list_item);
    reload();
    Intent in = getIntent();
    this.link = in.getStringExtra("link");
    String link = in.getStringExtra(KEY_LINK);
    this.web = (WebView) findViewById(R.id.webView1);
    TextView Desc = (TextView) findViewById(R.id.description_label);
    loadStuff localloadStuff = new loadStuff();
    String[] arrayofString = new String[1];
    arrayofString[0] = this.link;
    localloadStuff.execute(arrayofString);
    SingleItemActivity.this.link = SingleItemActivity.this.link
                                .replace("http://www.", "http://m.");
    SingleItemActivity.this.web.getSettings()
                                .setJavaScriptEnabled(true);
    SingleItemActivity.this.web.loadUrl(SingleItemActivity.this.link);
    SingleItemActivity.this.web.setWebViewClient(new WebViewClient());
    

    【讨论】:

      【解决方案3】:
       public class loadStuff extends AsyncTask<String, Void, Void> {
            public loadStuff() {
            }
            @Override
            protected Void doInBackground(String... params) {
                SingleItemActivity.this.link = SingleItemActivity.this.link
                        .replace("http://www.", "http://m.");
                SingleItemActivity.this.web.getSettings()
                        .setJavaScriptEnabled(true);
      
                return null;
            }
          @Override
          protected void onPostExecute(Void result) {
              // TODO Auto-generated method stub
              super.onPostExecute(result);
               SingleItemActivity.this.web.loadUrl(SingleItemActivity.this.link);
               SingleItemActivity.this.web.setWebViewClient(new WebViewClient());
          }
      
      
        }
      

      不要在 doInBackground 方法中更新 UI

      【讨论】:

      • 如果您在答案本身中提到这一点会更好,而不是在它下面的评论...
      猜你喜欢
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多