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- is-there-any-100-working/3821998 # 3821998 –

+0

после передачи объекта 'socketserver' в Main.class, что вы хотите получить из этого объекта' socketserver'? –

ответ

0

Не пытайтесь передать экземпляр SocketServer. Одним из его свойств является контекст, который означает, что вы не должны использовать его вне исходного контекста, который он был создан (т. Е. Действия, в котором он был создан), или у вас будут утечки памяти.

Ваш класс SocketServer нуждается в IP и порту. Это информация, которую вы должны передавать между действиями, а затем использовать ее для создания другого экземпляра вашего класса SocketServer.

Смежные вопросы