我使用以下代码在一定时间后更新列表。
Myactivity {
setTimer() {
Runnable r = new Runnable() {
run() {
if(!isListUpdated) {
update();//n/w operation
} else {
show();//this is a UI operation
listupdated = false;
}
Handler.postDelayed(this,next); //repeat after next
}
new Thread(r).start();
}
}
}
经过2-3次迭代后,它会给出NetworkOnMainThreadException
。有人可以告诉这段代码有什么问题吗?
答案 0 :(得分:2)
你应该不在主线程中进行网络操作。创建一个单独的线程并在那里进行操作。
您可以使用 AsyncTask ,服务或单独的帖子。你将在哪里进行网络操作。并通过BroadcastReceiver,Handler或AsyncTask进行更新。
了解AsyncTask here
答案 1 :(得分:2)
当您尝试在主线程中执行网络操作时,通常会发生此异常。使用AsyncTask
进行网络操作。
答案 2 :(得分:1)
考虑使用runOnUiThread
在非UI线程中执行UI操作。
您的代码段应如下所示。
Runnable runnable = new Runnable() {
public void run() {
if (!isListUpdated) {
runOnUiThread(new Runnable() {
public void run() {
update(); //n/w operation
}
});
} else {
runOnUiThread(new Runnable() {
public void run() {
show(); //n/w operation
}
});
listupdated = false;
}
handler.postDelayed(runnable, next);
}
};
答案 3 :(得分:1)
应用程序尝试执行时抛出的异常 在其主线程上进行网络操作。
因此您需要使用Thread,runOnUiThread,AsyncTask,Handler或HandlerThread来更新后台主题中的UI元素。
<小时/> 使用线程和runOnUiThread的示例:
public void myThread(){
Thread th=new Thread() {
@Override
public void run() {
try
{
while(true) {
Current_Activity.this.runOnUiThread( new Runnable() {
@Override
public void run() {
//UPDATE UI FROM HERE
}
});
}
}catch (InterruptedException e) {
// TODO: handle exception
}
}
};
th.start();
}
答案 4 :(得分:0)
我猜你使用的是蜂窝版本,你最好使用AsyncTask来解决你的问题。