Java 更改数据值后如何重新启动处理程序?
早上好StackOverFlow我的Java 更改数据值后如何重新启动处理程序?,java,android,handler,Java,Android,Handler,早上好StackOverFlow我的处理程序有一些问题我正试图在main活动myClient.java中启动,50秒后发送消息并停止客户端,这就是工作,但每次更改ip\U txt或term\u txt在设置中。java (通过单击按钮将数据从EditText保存到DB) 这是我的主要活动: public class MainActivity extends AppCompatActivity { Server server; Client client;
处理程序有一些问题
我正试图在main活动
myClient.java中启动,50秒后发送消息并停止客户端,这就是工作,但每次更改ip\U txt
或term\u txt
在设置中。java
(通过单击按钮将数据从EditText保存到DB)
这是我的主要活动:
public class MainActivity extends AppCompatActivity {
Server server;
Client client;
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
new ConnectTask().execute("");
if (client != null) {
client.sendMessage("IP#" + ipp + " " + "N#" + trm);
}
if (client != null) {
client.stopClient();
}
}
};
settings Settings;
public static TextView terminale, indr, msg;
TextView log;
String ipp,trm;
DataBaseHandler myDB;
allert Allert;
SharedPreferences prefs;
String s1 = "GAB Tamagnini SRL © 2017 \n" +
"Via Beniamino Disraeli, 17,\n" +
"42124 Reggio Emilia \n" +
"Telefono: 0522 / 38 32 22 \n" +
"Fax: 0522 / 38 32 72 \n" +
"Partita IVA, Codice Fiscale \n" +
"Reg. Impr. di RE 00168780351 \n" +
"Cap. soc. € 50.000,00 i.v. \n" + "" +
"REA n. RE-107440 \n" +
"presso C.C.I.A.A. di Reggio Emilia";
ImageButton settings, helps, allerts, home;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Utils.darkenStatusBar(this, R.color.colorAccent);
server = new Server(this);
myDB = DataBaseHandler.getInstance(this);
msg = (TextView) findViewById(R.id.msg);
log = (TextView) findViewById(R.id.log_avviso);
settings = (ImageButton) findViewById(R.id.impo);
helps = (ImageButton) findViewById(R.id.aiut);
allerts = (ImageButton) findViewById(R.id.msge);
home = (ImageButton) findViewById(R.id.gab);
terminale = (TextView) findViewById(R.id.terminal);
indr = (TextView) findViewById(R.id.indr);
final Cursor cursor = myDB.fetchData();
if (cursor.moveToFirst()) {
do {
indr.setText(cursor.getString(1));
terminale.setText(cursor.getString(2));
Client.SERVER_IP = cursor.getString(1);
trm = cursor.getString(2);
} while (cursor.moveToNext());
}
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
ipp = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
handler.postDelayed(runnable,5000);
cursor.close();
server.Parti();
home.setOnClickListener(new View.OnClickListener() {
int counter = 0;
@Override
public void onClick(View view) {
counter++;
if (counter == 10) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setCancelable(true);
builder.setMessage(s1);
builder.show();
counter = 0;
}
}
});
settings.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent impostazioni = new Intent(getApplicationContext(), settingsLogin.class);
startActivity(impostazioni);
}
});
helps.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent pgHelp = new Intent(getApplicationContext(), help.class);
startActivity(pgHelp);
}
});
allerts.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Server.count = 0;
SharedPreferences prefs = getSharedPreferences("MY_DATA", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.clear();
editor.apply();
msg.setVisibility(View.INVISIBLE);
Intent pgAlert = new Intent(getApplicationContext(), allert.class);
startActivity(pgAlert);
}
});
}
@Override
protected void onDestroy() {
super.onDestroy();
server.onDestroy();
}
public class ConnectTask extends AsyncTask<String, String, Client> {
@Override
protected Client doInBackground(String... message) {
client = new Client(new Client.OnMessageReceived() {
@Override
public void messageReceived(String message) {
publishProgress(message);
}
});
client.run();
return null;
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
Log.d("test", "response " + values[0]);
}
}
}
(如果我没有解释,我想在应用程序开始时启动
处理程序,并且在EditText-ip_-txt
或EditText-term_-txt
中更改数据后立即重新启动它)。我会创建变量来存储处理程序和可运行的,然后,如果要重新启动,只需使用:
yourHandler.removeCallback(yourRunnable);
yourHandler.postDelayed(yourRunnable,time);
开始的时候,就像你做的那样
yourHandler.postDelayed(yourRunnable,5000);
希望就是你想要的
如何创建它们:
public class ClassName{
Handler yourHandler = new Handler();
Runnable yourRunnable = new Runnable(){
@Override
public void run() {
//yourCode
}
};
// Rest of class code
}
与您在代码中所做的相同,只是在变量中。如何创建该变量?你能为它添加一个例子吗?我刚刚用MainActivity代码更新了这个问题,当我创建runnable时,它使“new ConnectTask().execute(“”)”工作,但其他操作(其他2个if)没有启动。我假设您的客户端
必须为空。实际上,它在与TCP客户端的连接中以及在第二个消息发送和停止客户端中使用了2个不同的runnable,但是我如何才能像上面所做的那样将其放在1 runnable中?比如我可以在ConnectTask和两个if之间的runnable中做一个延迟吗?当然你可以做一个延迟,只要把你的if代码放到另一个runnable中并做另一个处理程序,这将使if语句在你想要的时间后得到计算
public class ClassName{
Handler yourHandler = new Handler();
Runnable yourRunnable = new Runnable(){
@Override
public void run() {
//yourCode
}
};
// Rest of class code
}