마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

AsyncTask 사용 관련 질문있습니다!!

0 추천

안드로이드를 클라이언트로 해서 서버랑 통신하는 프로그램을 구현하고 있습니다

1. 클라이언트에서 정보를 서버로 보내면 2. 서버에서 정보를 받아 결과값을 생성하고

3. 그 결과값을 다시 클라이언트에게 보내면 클라이언트가 그것을 받아 setText에서 결과값을 보여주는 구조입니다

 1번은 그냥 쓰레드로 하고 3번은 통신쓰레드에서는 UI를 못 건드린다고 하여 AsyncTask를 사용해 구현을 했는데요

3번이 안되네요 ㅠㅠ 에러는 안나는데 결과값을 받아오질 못하는 것 같습니다

AsyncTask   부분 코드 첨부합니다 조언 부탁드려요 ㅠㅠ

class OTPreceiver extends AsyncTask<Void, Void, Void>{
 
Socket socket;
static DataInputStream in;
static String answer;
    InetAddress serverAddr;
    static String ID;
 
static int n;
static byte[] temp;
static String OTPc;
static String[] str = new String[3]; //str[0]=Seed, str[1]=n, str[2]=OTP
static String time;
 
  @Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
  try {
serverAddr = InetAddress.getByName(MainActivity.serverIP);
socket = new Socket(serverAddr, 9999);
in = new DataInputStream(socket.getInputStream());
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 
while(in!=null) {
try {
answer = in.readUTF(); //서버 결과값 받아와서 저장
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;   
  }
  protected void onPostExecute(){ //UI셋팅부분
  super.onPostExecute(null);
 
if(answer.startsWith("A")){ //서버에서 전송한 것의 앞부분이 A면 클라이언트 창에 보이게 셋팅
MainActivity.result.setText(answer.substring(1));
MainActivity.OTPcState.setText(" ");
MainActivity.OTPsState.setText(" ");
}
 
else if(answer.startsWith("?")){ //TOTP
str = answer.split(":"); 
str[0] = str[0].substring(1); //앞에 붙혔던 ?빼고 저장
 
       GregorianCalendar gc = new GregorianCalendar();
       SimpleDateFormat sf = new SimpleDateFormat("yyyyMMddHHmm"); //분단위까지, 1분마다 OTP가 바뀌게 설정
       Date d = gc.getTime(); 
       time = sf.format(d); //time = 시간정보
       
try {
MessageDigest sh = MessageDigest.getInstance("SHA-256");
temp = MainActivity.Tpw.getText().toString().concat(str[0]).concat(time).getBytes();
//입력한 pass + 서버로부터 받은 seed + time(시간정보) 를 temp에 넣는다
n = Integer.parseInt(str[1]);
 
for(int i=0; i<n; i++){
sh.update(temp);
temp = sh.digest();
}
 
StringBuffer sd = new StringBuffer();
for(int j=0; j<temp.length; j++){
sd.append(Integer.toString((temp[j]&0xff) + 0x100,16).substring(1));
}
OTPc = sd.toString();
if(OTPc.equals(str[2])){
MainActivity.result.setText("인증이 완료되었습니다."); //토스트
MainActivity.OTPcState.setText("클라이언트의 OTP : "+OTPc);
MainActivity.OTPsState.setText("서버의 OTP : "+str[2]);
}
else{
MainActivity.result.setText("인증에 실패하였습니다."); //토스트
MainActivity.OTPcState.setText("클라이언트의 OTP : "+OTPc); 
MainActivity.OTPsState.setText("서버의 OTP : "+str[2]);
}
}catch(Exception e) {
System.err.println(e);
}
}
 
else { //not TOTP
str = answer.split(":"); 
 
try {
MessageDigest sh = MessageDigest.getInstance("SHA-256");
temp = MainActivity.Tpw.getText().toString().concat(str[0]).getBytes();
//입력한 pass + 서버로부터 받은 seed 를 temp에 넣는다
n = Integer.parseInt(str[1]);
 
for(int i=0; i<n; i++){
sh.update(temp);
temp = sh.digest();
}
 
StringBuffer sd = new StringBuffer();
for(int j=0; j<temp.length; j++){
sd.append(Integer.toString((temp[j]&0xff) + 0x100,16).substring(1));
}
OTPc = sd.toString();
if(OTPc.equals(str[2])){
MainActivity.result.setText("인증이 완료되었습니다.");
MainActivity.OTPcState.setText("클라이언트의 OTP : "+OTPc);
MainActivity.OTPsState.setText("서버의 OTP : "+str[2]);
}
else{
MainActivity.result.setText("인증에 실패하였습니다.");
MainActivity.OTPcState.setText("클라이언트의 OTP : "+OTPc);
MainActivity.OTPsState.setText("서버의 OTP : "+str[2]);
}
}catch(Exception e) {
System.err.println(e);
}
}
}
}

 

 

익명사용자 님이 2014년 10월 20일 질문

1개의 답변

0 추천
AsyncTask가 메인스레드에서 생성되었는지 확인해보세요
alkyne (22,960 포인트) 님이 2014년 10월 21일 답변
메인스레드 안에서 execute 하고 있습니다.. ㅜㅜ
버튼을 누르기전과 후 둘다 해봤느데 안되고 있습니다
...