我以前成功运行过类似的代码,但这次它不起作用!我真的不明白为什么。
有什么想法吗?
public class SingleMenuItemActivity extends Activity {
private static String url = "http://www.tatangalar.com/android/takim_detay.php?takimID=5";
private static final String TAG_MACBILGISI = "son10mac";
private static final String TAG_10 = "10";
private static final String TAG_9 = "9";
JSONArray sonuclar = null;
String filan;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.benim2);
JSONParser jParser = new JSONParser();
JSONObject json = jParser.getJSONFromUrl(url);
try {
sonuclar = json.getJSONArray(TAG_MACBILGISI);
for(int i = 0; i < sonuclar.length(); i++){
JSONObject c = sonuclar.getJSONObject(i);
String s_on = c.getString(TAG_10);
String s_dokuz = c.getString(TAG_9);
filan = s_on;
}
} catch (JSONException e) {
e.printStackTrace();
}
TextView txtsecilen = (TextView) findViewById(R.id.son9);
txtsecilen.setText(filan);
}
}
答案 0 :(得分:1)
由于这行代码,您收到NetworkOnMainThreadException
:
jParser.getJSONFromUrl(url);
这曾经是一个警告,但在较新版本的Android操作系统上是不允许的。您不能从主UI线程访问互联网,例如在onCreate()
方法中。从单独的runOnUIThread()
,Thread/Runnable
或AsyncTask
发送您的互联网命令,您的NetworkOnMainThreadException
问题将得到解决。
Android不允许这样做,以确保您不会在长期任务期间通过强制您在备用线程中执行耗时的活动来挂起UI。
示例强>:
runOnUiThread(new Runnable() {
@Override
public void run() {
...
jParser.getJSONFromUrl(url);
...
}
});
您可能希望显示ProgressDialog
并在Thread
完成后关闭它。 AsyncTask
涉及更多步骤,但非常适合此任务,因为它提供了用于显示,更新和解除ProgressDialog
的挂钩。