2014-02-17 3 views
0

소켓 연결로 온라인 게임을 작성하려고합니다. 그래서 asynctask를 사용하여 소켓 연결을 만듭니다.asynctask를 android의 다른 활동에 전달하는 방법은 무엇입니까?

SocketServer.java

public class SocketServer{ 

private MyCustomListener listener; 

private String ip = "127.0.0.1"; 
private int port = 4444; 

@SuppressWarnings("unused") 
private Context context; 
private SocketAsync socketAsync; 
private String dataInput, username; 

public SocketServer(Context context) { 
    this.context = context; 
} 

public void setOnRecieveMsgListener(MyCustomListener listener) { 
    this.listener = listener; 
} 

public void connect() { 
    socketAsync = new SocketAsync(); 
    socketAsync.execute(); 
} 

public void sentData(String x, String y, String z) { 
    dataInput = null; 
    JSONObject object = new JSONObject(); 
    // JSON Encode 
    socketAsync.sentJSON(object); 
} 

private class SocketAsync extends AsyncTask<Void, Void, String> { 

    private Socket socket; 
    private PrintWriter printWriter; 

    @Override 
    protected String doInBackground(Void... params) { 
     try { 
      socket = new Socket(InetAddress.getByName(ip),port); 
      OutputStreamWriter streamOut = new OutputStreamWriter(socket.getOutputStream(), "UTF-8"); 
      printWriter = new PrintWriter(streamOut); 
      streamOut.flush(); 
      BufferedReader streamIn = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8")); 
      Looper.prepare(); 
      while(socket.isConnected()) { 
       try { 
        dataInput = streamIn.readLine(); 
        listener.onRecieveMessage(new MyListener(dataInput)); 
       } 
       catch(Exception e) {} 
      } 
      Looper.loop(); 
     } 
     catch(Exception e) {} 
     return null; 
    } 

    public void sentJSON(JSONObject object) { 
     if(socket.isConnected()) { 
      try { 
       printWriter.println(object.toString()); 
       printWriter.flush(); 
      } 
      catch(Exception e) {} 
     } 
    } 

} 
} 

(자) Login.class

public class Login extends Activity implements MyCustomListener { 

JSONObject object; 
SocketServer socketserver; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.login); 

    socketserver = new SocketServer(this); 
    socketserver.setOnRecieveMsgListener(this); 
    socketserver.connect(); 
    button(); 
} 

private void button() { 
    Button loginBt = (Button)findViewById(R.id.login_bt); 
    final EditText un = (EditText)findViewById(R.id.username); 
    final EditText ps = (EditText)findViewById(R.id.password); 
    final String[] logindata = new String[2]; 

    loginBt.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      logindata[0] = un.getText().toString(); 
      logindata[1] = ps.getText().toString(); 
      socketserver.setUsername(logindata[0]); 
      socketserver.sentData("SERVER", "TEST", "login"); 
     } 
    }); 
} 

private void toMainScreen() { 
    Intent x = new Intent(this,Main.class); 
    startActivity(x); 
} 

@Override 
public void onRecieveMessage(MyListener ml) { 
    try { 
     JSONObject json = new JSONObject(ml.getMsgStr()); 
     System.out.println(json.getString("content")); 
     if(json.getString("content").equals("TRUE")) { 
      toMainScreen(); 
     } 
     else 
      Toast.makeText(getApplicationContext(), "Login Fail", Toast.LENGTH_SHORT).show(); 
    } catch (JSONException e) { 
     Log.e("## JSON DECODE", e.toString()); 
     e.printStackTrace(); 
    } 
} 
} 

Main.class가

public class Main extends Activity implements MyCustomListener { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //do some thing 
} 

@Override 
public void onRecieveMessage(MyListener ml) { 
    System.out.println("MAIN : " + ml.getMsgStr()); 
} 
} 
그래서에 로그인 클래스에서 객체 "socketserver"를 전달할 수있는 방법을

주류? 또는 이와 비슷한 방법이 있습니까?

영어로보기 좋지 않음.

+0

가장 쉬운 방법은 AsyncTask에 대한 일반화 클래스를 만들고 필요한 곳 ​​어디에서나 호출하는 것입니다. – Kunu

+0

이것 좀 보시기 바랍니다 http://stackoverflow.com/questions/3821423/background-task-progress-dialog-orientation-change- 'socketserver' 객체를 Main.class에 전달한 후 is-there-any-100-working/3821998 # 3821998 –

+0

이 그'socketserver' 객체에서 무엇을 가져 오려고합니까? –

답변

0

SocketServer 인스턴스를 전달하지 마십시오. 그 중 하나는 컨텍스트입니다. 즉, 컨텍스트 (즉, 컨텍스트가 생성 된 원래 컨텍스트 외부에서 사용하지 말아야합니다. 그렇지 않으면 메모리 누수가 발생 함)를 의미하는 컨텍스트입니다.

SocketServer 클래스에는 IP와 포트가 필요합니다. 이 정보는 활동간에 전달해야하는 정보로, SocketServer 클래스의 다른 인스턴스를 만들 때 사용해야합니다.

관련 문제