从 MainActivity 类中的另一个函数访问 WebView

Posted

技术标签:

【中文标题】从 MainActivity 类中的另一个函数访问 WebView【英文标题】:Access to WebView from another function in MainActivity class 【发布时间】:2016-03-19 08:24:38 【问题描述】:

如何正确访问onCreate 函数中的“视图”变量?我想要loadUrl(),但它会在public Emitter.Listener onServerReceive = new Emitter.Listener() view = loadUrl 上引发错误:

E/androidRuntime: FATAL EXCEPTION: main java.lang.NullPointerException
    at com.myapp.MainActivity$7$1.run(MainActivity.java:399)
    at android.os.Handler.handleCallback(Handler.java:615)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:177)
    at android.app.ActivityThread.main(ActivityThread.java:4947)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
    at dalvik.system.NativeStart.main(Native Method)
import com.github.nkzawa.emitter.Emitter;
....

public class MainActivity extends Activity 
    WebView view;
    Socket mSocket;

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ...
        view = (WebView) findViewById(R.id.webView);
        view.getSettings().setjavascriptEnabled(true);
        ...
        view.loadUrl("file:///android_asset/loading.html");

    

    ...

    @JavascriptInterface
    public void websocket_start()
        try 
            mSocket = IO.socket("http://some web com:8888");
            mSocket.on("connect", onConnect);
            mSocket.on("server_receive", onServerReceive);
            mSocket.connect();
         catch (URISyntaxException e) 
    


public Emitter.Listener onConnect = new Emitter.Listener() 
    @Override
    public void call(final Object... args) 
        runOnUiThread(new Runnable() 
            @Override
            public void run() 
                JSONObject jsonRootObject = new JSONObject();
                try 
                    jsonRootObject = new JSONObject(" pn: " + global_login + ", pp: " + global_pass + " ");
                 catch (JSONException e) 
                    throw new RuntimeException(e);
                
                mSocket.emit("Auth", jsonRootObject);
            
        );
    
;

    public Emitter.Listener onServerReceive = new Emitter.Listener() 
        @Override
        public void call(final Object... args) 
            runOnUiThread(new Runnable() 
                @Override
                public void run() 
                    final String argsStr = TextUtils.join(",", args);
PROBLEM HERE "view" is null ->         view.loadUrl("javascript:receive('" + argsStr + "')");
                
            );
        
    ;


我做错了什么,如何解决?谢谢!

【问题讨论】:

在我看来,您可能想使用 OnCreateView(),而不是 OnCreate()。您正在寻找的视图可能尚未在 OnCreate() 中膨胀。 您是否有任何代码将null 分配给view?另外,您是否以其他方式使用onServerReceive 你能发布你的完整代码吗? 我添加了 onConnect,忘记了。 看起来你的 'onServerReceive' 在 'onCreate()' 之前被调用。你能检查一下吗? 【参考方案1】:

您正在尝试在初始化之前使用view。您需要等到view = (WebView) findViewById(R.id.webView); 被调用后才能初始化onServerReceive

编辑:再看看这个,更有可能发生的是,在 viewonCreate() 中初始化之前,您正在使用 onServerRecieve 的实例。

@Override
public void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    view = (WebView) findViewById(R.id.webView);
    onServerRecieve = createListener()
    view.getSettings().setJavaScriptEnabled(true);
    ...
    view.loadUrl("file:///android_asset/loading.html");



...

@JavascriptInterface
public void websocket_start()
    try 
        mSocket = IO.socket("http://some web com:8888");
        mSocket.on("connect", onConnect);
        mSocket.on("server_receive", onServerReceive);
        mSocket.connect();
     catch (URISyntaxException e) 


private Emitter.Listener createListener() 
    return new Emitter.Listener() 
    @Override
    public void call(final Object... args) 
        runOnUiThread(new Runnable() 
            @Override
            public void run() 
                final String argsStr = TextUtils.join(",", args);
                view.loadUrl("javascript:receive('" + argsStr + "')");
            
        );
    
;


public Emitter.Listener onServerReceive;


【讨论】:

对不起,我忘了告诉我有相同的 Emitter.Listener 用于 onConnect,现在它们发生冲突并且永远不会触发 onConnect。我编辑了第一篇文章。 你能再贴一些代码吗,不清楚你是如何使用Emitter.Listeners的,但是我很肯定问题是call()view被初始化之前被执行. 没有更多的代码,就这样,所有其他功能都与“view”对象或mSocket对象无关。你能展示一下如何一起使用这两个 Emitter.Listener 吗?【参考方案2】:

终于找到了答案和问题

我有这个

view.addJavascriptInterface(new MainActivity(), "access_android");

在 web js 中,我使用 "access_android.websocket_emit()" 访问了 android

我认为由于"new MainActivity()",它正在创建一个未定义“视图”的新类。所以我用"this"替换了"new MainActivity()"

view.addJavascriptInterface(this, "access_android");

现在一切正常! 谢谢再见

【讨论】:

以上是关于从 MainActivity 类中的另一个函数访问 WebView的主要内容,如果未能解决你的问题,请参考以下文章

如何从同一项目中的另一个类访问主类中的变量? [复制]

从 MainActivity 中的另一个 xml 获取元素 [关闭]

从当前项目中的另一个模块启动 MainActivity

如何从同一个类中的方法访问类数据成员[重复]

如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]

如何从 UICollectionView 的另一个类中的函数加载图像?我正在使用油漆代码