安卓系统 - 空指针异常错误

3
我正在进行websocket通信,从安卓设备(客户端)到基于Linux的PC(服务器)。我成功连接了websocket到服务器,但问题是发送数据(字符串值)时失败了。
有一个旋转木马视图,其中有四个产品。因此,当我点击产品0的照片时,我将字符串设置为“product0”,并将此字符串值发送到服务器。我正在使用Autobahn库。
代码在这里:
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!");
                }
            });
        }

可能是"extends Fragment"导致了错误?..错误信息如下..

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)

当我点击照片发送字符串值时,出现了错误。

那么Ken的答案似乎是正确的。 - gunar
@gunar 不,答案还不正确!我在主页面中调用了'connect()'。 - user2500696
@gunar Ken说我需要在使用“mConnection”之前调用“connect()”。但是,在另一个类中,已经调用了“connect()”。您可以在此处查看详细问题:“http://stackoverflow.com/questions/17190843/android-autobahn-websocket-sending-message-errornullpointerexception” - user2500696
当然:这些是两个不同的实例(你在主页面有一个WebSocketConnection实例,在Fragment中有一个不同的实例)...难怪你会遇到那些NPEs。 - gunar
那么...我该怎么修复它呢..?有一个开/关按钮来连接/断开服务器,我需要在另一个类中发送一条消息。 - user2500696
显示剩余10条评论
1个回答

2
错误发生在这里的 onClick
mConnection.sendTextMessage(id1);

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

根据文档,你需要在使用mConnection之前调用.connect()

WebSocketConnection.java的137行是:

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

mWriter在调用.connect()之前是空的。 源代码

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


那么,在我的代码中应该在哪里调用.connect()呢?因为当我访问轮播视图时,Myoffers_Fragment.class会产生4个连接。 - user2500696
不知道你的架构和具体需求是什么,很难下定论。个人认为,如果我需要频繁访问此连接,我会让我的 Activity 控制它,而不是让各种 Fragment 来控制。 - Ken Wolf
实际上,我创建了Websocket_connector.class,并在代码中声明了'public void connect(final String wsuri)'。 - user2500696
希望我已经回答了你的问题。如果你有关于架构的另一个问题,也许最好开一个新的问题,或者也许其他人会帮助你。祝你好运! - Ken Wolf
在主页面中,我像这样调用了 'A.connect("ws://192.168.3.100:7681");'。之后,我访问了 MyOffers_Frgment,但结果相同。我需要在同一类中调用 connect() 吗? - user2500696

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接