我正在为Android构建一个简单的IRC客户端。
我使用AsyncTask连接到Freenode / IRC-server。
我可以很容易地从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;
}
}
在我的ChannelActvity上,我有一个EditView将文本/数据发送到服务器。
我的问题是在从服务器读取时将一些写入数据传递给AsyncTask。
(启动doInBackground-&gt;然后..只运行所以它可以将数据发送回我的ChannelActicity)
我尝试使用'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);
答案 0 :(得分:0)
如果您使用来自不同activity / services / intents / ...的共享首选项,则应将其与MODE_MULTI_PROCESS模式一起使用(常量值int = 4)。如果没有,文件被锁定,只有一个进程可以立即写入它!
因此,当您在多进程应用程序中调用共享首选项时,请执行以下操作:
SharedPreferences preferences = this.getSharedPreferences("myapp",4);
MODE_MULTI_PROCESS在所有版本上都是ON,直到android 2.3,但后者必须严格调用!官方文件说:
操作模式。使用0或MODE_PRIVATE作为默认操作,使用MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE来控制权限。如果多个进程正在改变相同的SharedPreferences文件,也可以使用MODE_MULTI_PROCESS位。 MODE_MULTI_PROCESS始终在针对Gingerbread(Android 2.3)及更低版本的应用中启用,默认情况下在以后的版本中关闭。