2013-04-09 1 views
0

Android 용 간단한 IRC 클라이언트를 구축 중입니다.Android : AsyncTask를 통해 scoket에 데이터를 쓰는 방법

AsyncTask를 사용하여 Freenode/IRC 서버에 연결합니다.

내가 쉽게 IRC 서버에서 모든 응답을 얻을 수

하는 I는 응답에 대화 기반을 표시 할 수 있습니다.

public class IrcTask extends AsyncTask<Void, String, Void> { 
    public IrcTask(Activity activity, ProgressDialog pdialog, ScrollView sv_channel_output, List<String> join_users, BufferedWriter writer, BufferedReader reader, TextView outputView, String channel, String nick, String login) { 
     this.activity = new WeakReference<Activity>(activity);//ChannelActivity 
     this.nick = nick; 
     this.login = login; 
    } 
    @Override 
    protected Void doInBackground(Void... Sparams) { 
     // Connect directly to the IRC server. 
     try { 
      // Log on to the server. 
      this.writer.get().write("NICK " + nick + "\r\n"); 
      this.writer.get().write("USER " + login + " 8 * : Freenode for Android App IRC Bot\r\n"); 
      this.writer.get().flush(); 

      // Join to the channel. 
      this.writer.get().write("JOIN " + channel + "\r\n"); 
      this.writer.get().flush(); 

      // Read lines from the server until it tells us we have connected. 
      String line = null; 
      while ((line = this.reader.get().readLine()) != null) { 
       publishProgress(line); 
       if (line.contains("PING ")) { 
        // We must respond to PINGs to avoid being disconnected. 
        this.writer.get().write("PONG " + line.substring(5) + "\r\n"); 
        this.writer.get().flush(); 
       } 
      } 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

내 ChannelActvity에서 텍스트/데이터를 서버로 보내도록 EditView가 있습니다.

내 문제는 일부 쓰기 데이터를 서버에서 읽는 동안 AsyncTask에 전달하는 것입니다.

나는 IrcServer에 쓰기 데이터를 전달하기 위해 '된 SharedPreferences'를 사용하여 시도했다 (후에 doInBackground-> .. 바로 실행되는 동안 그래서 내 ChannelActicity 다시 데이터를 보낼 수 있습니다 시작).

그러나 그것은 작동하지 않습니다 ...이처럼

...

// Read lines from the server until it tells us we have connected. 
      String line = null; 
      while ((line = this.reader.get().readLine()) != null) { 
       //gets/sets IRC-detils from 'MainActivity' 
       pref = this.activity.get().getSharedPreferences("writeToIrcTack", 0); 
       if(pref.getString("data", "").length() >0) 
       { 
        Log.d("doInBackground->IF-it-gets-data", "pref.getString=="+pref.getString("data", "")); 
        this.writer.get().write("NOTICE "+channel+" " + pref.getString("data", "") + "\r\n"); 
        this.writer.get().flush(); 
       } 
       publishProgress(line); 
+1

오히려 내가 – njzk2

+0

내가 Hanlders과 함께 노력할 것입니다 .. – Voidcode

답변

0

당신이 다른 활동/서비스/의도에서 공유 설정을 사용하는이/... 당신은 그것을 사용해야하는 경우 mode MODE_MULTI_PROCESS (상수 값 int = 4). 그렇지 않으면 파일이 잠기고 한 프로세스 만 한 번에 쓸 수 있습니다!

SharedPreferences preferences = this.getSharedPreferences("myapp",4); 

MODE_MULTI_PROCESS는 안드로이드 2.3까지 모든 버전에 ON이지만, 후자는 엄격하게 호출해야합니다 :

은 그래서 당신은 멀티 프로세스 응용 프로그램에서 공유 설정을 호출 할 때 다음과 같이 해! 공식 문서는 다음과 같이 말합니다 :

작동 모드. 사용 권한을 제어하려면 MODE_WORLD_READABLE 및 MODE_WORLD_WRITEABLE의 기본값 인 0 또는 MODE_PRIVATE를 사용하십시오. MODE_MULTI_PROCESS 비트는 여러 프로세스가 동일한 SharedPreferences 파일을 변경하는 경우에도 사용할 수 있습니다. 진저 브레드 (Android 2.3) 이하를 타겟팅하는 앱에서는 MODE_MULTI_PROCESS이 (가) 항상 켜져 있으며 이후 버전에서는 기본적으로 사용 중지됩니다.

+0

를 핸들러 또는 브로드 캐스트를 사용하십시오/...하지만 코드 예제는 공유 환경 설정에서도 작동합니다. 언급 한 것처럼 호출해야합니다. – Voidcode

+0

예, 핸들러는 다른 서비스/활동과 의사 소통을 할 수있는 권리 방법입니다 .. 의견을 njzk2로 핸들러를 사용하려고합니다 좋아 – Utisevalec

+0

나는 핸들러와 함께 이것을 구현했다. 그러나 그것을 알고있는 신은 공유 환경 설정과도 작동한다 :) – Voidcode