我的代码中有一点问题
我有测试IP Ping的代码
public class StartPinging extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
runOnUiThread(new Runnable() {
@Override
public void run() {
try {
Process process = Runtime.getRuntime().exec("/system/bin/ping -w 6 -c 6 " + String.valueOf(IP.getText()));
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ( (temp = reader.readLine()) != null){
Log.e("",temp);
pingAdapter.add(temp);
pingAdapter.notifyDataSetChanged();
}
reader.close();
process.destroy();
} catch (IOException e) {
e.printStackTrace();
}
}
});
return null; }}
此代码工作正常 但我希望代码逐行添加信息 就像它在“LOG”中显示的那样
但在我的代码中,应用程序冻结,直到ping完为止,然后它在ListView中一次显示所有行
有办法解决这个问题吗?
并谢谢
答案 0 :(得分:1)
不要在doinbackground方法中使用runonuithread。
在Asynctask中,preExecute()和postExecute()在线程上执行,因此您可以使用它而不是runOnUiThread(), 并且doInBackGround()在工作线程上执行。
答案 1 :(得分:0)
尝试在UI线程内部仅运行相对于ui更改的部分。
public class StartPinging extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... params) {
@Override
public void run() {
try {
Process process = Runtime.getRuntime().exec("/system/bin/ping -w 6 -c 6 " + String.valueOf(IP.getText()));
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ( (temp = reader.readLine()) != null){
Log.e("",temp);
runOnUiThread(new Runnable() {
pingAdapter.add(temp);
pingAdapter.notifyDataSetChanged();
});
}
reader.close();
process.destroy();
} catch (IOException e) {
e.printStackTrace();
}
}
return null; }}