首页 > 解决方案 > 如何在新线程中创建和运行 WebView?

问题描述

如何在新线程中运行 WebView。

public class MainActivity extends AppCompatActivity {
class demo implements Runnable{
    @Override
    public void run() {
       try{  
           WebView mywebview = new WebView(MainActivity.this);
           mywebview.loadUrl("https://www.google.com");
       }catch (Exception e){

           e.printStackTrace();
       }
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    demo obj = new demo();
    Thread t = new Thread(obj);
    t.start();
}

}

它的显示给了我例外。

W / System.err:java.lang.NullPointerException:尝试从android.os.Handler的空对象引用上的字段'android.os.MessageQueue android.os.Looper.mQueue'读取。(Handler.java:229)在 android.os.Handler.(Handler.java:137) 在 com.android.webview.chromium.WebViewChromiumFactoryProvider.ensureChromiumStartedLocked(WebViewChromiumFactoryProvider.java:9042)

标签: androidwebview

解决方案


你为什么要那样做?在 mainThread 上创建WebView和加载 url就可以了。如果要更新视图,必须在 mainThread 上进行。

如果您使用的是简单线程,则使用Handler或消息,或者runOnUiThread您可以更新主线程的视图。

public class MainActivity extends Activity {
  private Handler uiHandler;
  private WebView webView;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main);

    uiHandler = new Handler();
    webView = findViewById(R.id.web_view);
  }

  // This method is to be executed on the new thread.
  public void simulate() {
    uiHandler.post(new Runnable() {
      @Override
      public void run() {
        // This is run on the UI thread.
        webView.loadUrl("https://www.google.com");
      }
    });
  }
  ...
}

推荐阅读