0

Android 用のシンプルな IRC クライアントを構築しています。

AsyncTask を使用して Freenode/IRC サーバーに接続しています。

irc-server からすべての応答を簡単に取得できます。

その後、応答に基づいてダイアログを表示できます。

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;
    }
}

私の ChannelActivity には、テキスト/データをサーバーに送信するための EditView があります。

私の問題は、サーバーからの読み取り中に AsyncTask に書き込みデータを渡すことです。

(開始後、doInBackground->while.. が実行されるだけで、データを ChannelActivity に送り返すことができます)

「SharedPreferences」を使用して、書き込みデータを IrcServer に渡してみました。

しかし、それは動作しません...

このような...

// 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);
4

1 に答える 1

0

異なるアクティビティ/サービス/インテント/... から共有設定を使用している場合は、モード MODE_MULTI_PROCESS (定数値 int = 4) で使用する必要があります。そうでない場合、ファイルはロックされ、一度に書き込めるのは 1 つのプロセスだけです。

したがって、マルチ プロセス アプリで共有設定を呼び出すときは、次のようにします。

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

MODE_MULTI_PROCESS は Android 2.3 までのすべてのバージョンで ON ですが、後者は厳密に呼び出す必要があります。公式ドキュメントは次のように述べています。

動作モード。デフォルトの操作には 0 または MODE_PRIVATE を使用し、パーミッションを制御するには MODE_WORLD_READABLE と MODE_WORLD_WRITEABLE を使用します。ビット MODE_MULTI_PROCESS は、複数のプロセスが同じ SharedPreferences ファイルを変更している場合にも使用できます。MODE_MULTI_PROCESS は、Gingerbread (Android 2.3) 以下をターゲットとするアプリでは常にオンになり、それ以降のバージョンではデフォルトでオフになります。

于 2013-04-09T16:04:28.557 に答える