在我的 Activity 中,我使用处理程序
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//do GUI stuff, edit views, etc..
}
};
我还有一个 Runnable
,它发送到 php 并等待 json 响应
Runnable runnable3 = new Runnable() {
public void run() {
JSONParserArray jsonParserRun = new JSONParserArray();
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("p1", "myParam1"));
try {
String link = "http://mylink.com/someFileOnServer.php";
JSONArray jArray = jsonParserRun.makeHttpRequest(link , "POST",
params);
if (jArray != null && jArray.length() != 0) {
} else {
//either null (because of throwing exception) or empty
}
} catch (Exception e) {
}
}
handler.sendEmptyMessage(0);
handler.postDelayed(runnable, 30000);
}
我每 30 秒重复一次该任务,最后在 onCreate() 中创建一个线程并向其传递 Runnable
@Override
public void onCreate(Bundle savedInstanceState) {
//other stuff
Thread t = new Thread(runnable3);
t.start();
}
即使我认为我正在启动一个新线程并将Runnable
传递给它,此代码也会抛出android.os.NetworkOnMainThreadException
。 JSONParserArray 类在其他情况下工作正常(所以不用担心)
但是,当我在 Runnable
中运行此方法时,它工作正常。
private boolean hasActiveInternetConnection() {
try {
new Socket().connect(new InetSocketAddress("google.com", 80), 3000);
return true;
} catch (Exception e) {
Log.i("tag", e.toString());
return false;
}
}
最佳答案
Handler.postDelayed()
在创建 Handler
的 Thread
中执行 Runnable
。在您的情况下,您在 UI 线程上的 Activity 中创建它。因此,第一次,Runnable
在单独的线程中执行,但第二次在 UI 线程中执行。
关于android - 我在使用单独的线程时得到 `android.os.NetworkOnMainThreadException`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19033771/