从 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
。
编辑:再看看这个,更有可能发生的是,在 view
在 onCreate()
中初始化之前,您正在使用 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.Listener
s的,但是我很肯定问题是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 获取元素 [关闭]