【问题标题】:Android - NullPointerException ErrorAndroid - NullPointerException 错误
【发布时间】:2013-06-19 10:31:30
【问题描述】:

我正在研究 websocket 通信。 从 android 设备(客户端)到基于 linux 的 PC(服务器)。 我成功地将 websocket 连接到服务器。但问题是我发送数据(字符串值)失败

有四个产品的轮播视图。因此,当我单击 product0 的照片时,我将字符串设置为“product0”并将此字符串值发送到服务器。 我正在使用高速公路库。

代码在这里

import de.tavendo.autobahn.WebSocketConnection;

public class Myoffers_Fragment extends Fragment {

    private static final String TAG = "Philips";
    private final WebSocketConnection mConnection = new WebSocketConnection();

    public static Fragment newInstance(Myoffers context, int pos, float scale)
    {
        Bundle b = new Bundle();
        b.putInt("pos", pos);
        b.putFloat("scale", scale);
        return Fragment.instantiate(context, Myoffers_Fragment.class.getName(), b);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        if (container == null) {
            return null;
        }

        LinearLayout l = (LinearLayout) inflater.inflate(R.layout.mf, container, false);

        int pos = this.getArguments().getInt("pos");
        TextView tv = (TextView) l.findViewById(R.id.text);
        tv.setText("Product " + pos);



        ImageButton product_photo = (ImageButton) l.findViewById(R.id.myoffer_image);


        if (pos == 0) {
            product_photo.setImageResource(R.drawable.myoffers_0);
            product_photo.setOnClickListener(new ImageButton.OnClickListener(){
                public void onClick(View v){
                    String id1 = "Product0";
                    Log.d(TAG, "Current product is : " + id1);
                    mConnection.sendTextMessage(id1);
                    Log.d(TAG, id1 + "is sent to server!");
                }
            });
        }

“扩展片段”是否可能会出错?... 发生如下错误..

06-19 12:02:01.310: E/AndroidRuntime(2712): FATAL EXCEPTION: main
06-19 12:02:01.310: E/AndroidRuntime(2712): java.lang.NullPointerException
06-19 12:02:01.310: E/AndroidRuntime(2712):     at de.tavendo.autobahn.WebSocketConnection.sendTextMessage(WebSocketConnection.java:137)
06-19 12:02:01.310: E/AndroidRuntime(2712):     at com.example.philips.Myoffers_Fragment$1.onClick(Myoffers_Fragment.java:56)
06-19 12:02:01.310: E/AndroidRuntime(2712):     at android.view.View.performClick(View.java:3511)
06-19 12:02:01.310: E/AndroidRuntime(2712):     at android.view.View$PerformClick.run(View.java:14105)
06-19 12:02:01.310: E/AndroidRuntime(2712):     at android.os.Handler.handleCallback(Handler.java:605)
06-19 12:02:01.310: E/AndroidRuntime(2712):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-19 12:02:01.310: E/AndroidRuntime(2712):     at android.os.Looper.loop(Looper.java:137)
06-19 12:02:01.310: E/AndroidRuntime(2712):     at android.app.ActivityThread.main(ActivityThread.java:4446)
06-19 12:02:01.310: E/AndroidRuntime(2712):     at java.lang.reflect.Method.invokeNative(Native Method)
06-19 12:02:01.310: E/AndroidRuntime(2712):     at java.lang.reflect.Method.invoke(Method.java:511)
06-19 12:02:01.310: E/AndroidRuntime(2712):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-19 12:02:01.310: E/AndroidRuntime(2712):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-19 12:02:01.310: E/AndroidRuntime(2712):     at dalvik.system.NativeStart.main(Native Method)

点击图片发送字符串值时出错。

【问题讨论】:

  • 你在哪里使用mConnection实际连接?
  • newInstance() 的最后一行应替换为:Myoffers_Fragment result = new Myoffers_Fragment(); result.setArguments(b); return result; ... 因为您似乎返回了一个带有空参数列表的片段。此外,错误在WebSocketConnection.sendTextMessage() 中引发。你能发布那个代码吗?
  • @gunar 你想让我发布哪个代码?..Myoffers_Fragment 是上面的代码
  • 在哪里可以找到课程WebSocketConnection?我在 Android 包中找不到它。你是用图书馆还是你写的东西?
  • @gunar WebSocketConnection 包含在 Autobahn 库中

标签: android nullpointerexception websocket autobahn


【解决方案1】:

错误发生在您的onClick 此处:

mConnection.sendTextMessage(id1);

看起来你在顶部声明了mConnection,但没有建立任何连接。

查看docs,您需要在使用之前在mConnection 上调用.connect()

WebSocketConnection.java 的第 137 行是:

public void sendTextMessage(String payload) {
    mWriter.forward(new WebSocketMessage.TextMessage(payload));
}

mWriter 在您调用 .connect() 之前为空。 Source code

因此,在使用mConnection 对象之前,请确保您有一个有效的连接(通过调用.connect())。

【讨论】:

  • 那么,我应该在哪里调用 .connect() 我的代码。因为当我访问轮播视图时,在 Myoffers_Fragment.class 中将产生 4 个。
  • 如果不确切知道您的架构是什么以及您要做什么,很难说。就个人而言,如果我需要经常访问此连接,我会让我的 Activity 控制它,而不是各种 Fragment。
  • 实际上,我创建了 Websocket_connector.class,在该代码中,我声明了“public void connect(final String wsuri)”
  • 好吧,希望我已经回答了你的问题。如果您对架构还有其他问题,最好打开另一个问题,或者其他人会提供帮助。祝你好运!
  • 在主页上,我调用了'A.connect("ws://192.168.3.100:7681");'像这样。之后,我访问了 MyOffers_Frgment.. 但结果相同。我需要在同一个类中调用 connect() 吗?
猜你喜欢
  • 1970-01-01
  • 2021-02-23
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多