我用Activity+ViewPgae+Fragment做了一个翻页的程序,有四个页面,这四个页面都要接收UDP数据,
我 就做了一个UDP接收线程。在Fragment的onCreate中创建接收线程。程序运行没有问题,但问题是,当程序运行的时候,onCreate了A+B页面,当翻页到B页面以后,又Create了C页面,翻到了C页面了以后,Create了D页面。这样,我在OnCreate中一共创建了4次UDP接收数据的线程,在关闭线程的时候,就会出错。
请问大虾:怎样创建一次UDP线程,就可以在4个页面中使用了?我是刚做Android开发,不是太了解,请高手解答,不胜感激!UDP多线程Fragment

解决方案 »

  1.   

    线程使用单例模式就可以了!
    package com.example.udp;import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    import java.util.Arrays;import android.content.Context;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;import com.example.mypublic.MyAppData;public class UDPServerThread extends Thread { private static UDPServerThread udpServerThread;
    private Handler mHandler;
    private static MyAppData myAppData ;
    private static int ServerPort;
    private DatagramSocket mServerSocket = null; 

    public static UDPServerThread getInstance(Context context){
    if(null==udpServerThread){
    myAppData = ((MyAppData)context.getApplicationContext());
    ServerPort = myAppData.getServerPort();

    udpServerThread=new UDPServerThread();
    udpServerThread.start();
          }
    return udpServerThread;
    } @Override
    public void run() {
    // TODO Auto-generated method stub
    super.run();
            startServer();
    } // 开始服务
    private void startServer() {
    // TODO Auto-generated method stub
    byte[] request = new byte[8192];

    try {
    mServerSocket = new DatagramSocket(ServerPort);
    DatagramPacket pack = new DatagramPacket(request, request.length);

    try {

    while (true) {
    // 获取请求
    mServerSocket.receive(pack);
                    String RecMsg = new String(pack.getData(),0,pack.getLength());
        
                        // 数据处理
        String sBT,sBW,sCommandID,sData;
        int iDataLen,iMsgLen;
        iMsgLen = RecMsg.length();
    //包头
    sBT = RecMsg.substring(0, 1);
    //命令
    sCommandID = RecMsg.substring(1, 5);
    //长度(16进制)
    iDataLen =  Integer.parseInt(RecMsg.substring(5, 9), 16);
    //数据内容
    sData = RecMsg.substring(9, RecMsg.length()-1);
    //包尾
    sBW = RecMsg.substring(RecMsg.length()-1, RecMsg.length());
    char[]charsBT=sBT.toCharArray();
    char[]charsBW=sBW.toCharArray();
    int iBT = (int)charsBT[0];
    int iBW = (int)charsBW[0];
    if (iBT == 2 && iBW == 3 ){
    if (!sData.equals("") ){
    showResponse(sCommandID,sData,iDataLen);
    }
    }
    else showResponse("FFFF",iBT+" "+RecMsg +" "+iBW+" "+iMsgLen,0);  //接收数据错误返回值
    Arrays.fill(request,(byte)0);
    }


    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    //mServerSocket.close();
    } catch (SocketException e) {
    // TODO: handle exception
    e.printStackTrace();
    }
    }

    //发送消息到界面线程消息队列中
    public void showResponse( String id, String data,int iDataLen) {
    // TODO Auto-generated method stub
    Bundle bundle = new Bundle();
    bundle.putString("CommandID", id);
    bundle.putString("MSG", data);
    bundle.putInt("DataLength", iDataLen);
    Message msg = new Message();
    msg.setData(bundle);
    mHandler.sendMessage(msg);
    }

    public Handler getHandler() {
    return mHandler;
    } public void setHandler(Handler mHandler) {
    this.mHandler = mHandler;
    }}