Bu hatanın nedeni;android işletim sisteminin arayüz ile webe erişimi ayırmasından kaynaklanmaktadır.Yani Aynı anda hem arayüzde hemde webde işlem yapamazsınız.Bu işlemleri farklı çalışma alanlarına bölmeniz gerekmektedir.
Bu sorunun İki Çözümü mevcuttur.Birincisi her bir çalışma alanını threadlere bölmek ikincisini bir kaynakta gördüm ancak kesin sonuç verdiğinden emin değilim.
Bu işlemin Örnek kodu şu şekildedir.
public class Anasayfa extends Activity {
private TextView textView;
private String CONTENTS_URL = "http://www.numan.com/api/rawcontents";
@Override
protected void onCreate(Bundle savedInstanceState) {
final Handler mHandler = new Handler();
super.onCreate(savedInstanceState);
setContentView(R.layout.anasayfa);
downloadList();
final Runnable mUpdateResults = new Runnable() {
public void run() {
AnimateandSlideShow();
}
};
AnimateandSlideShow();
}
private void downloadList() {
Runnable runnable = new Runnable() {
@Override
public void run() {
getContentList();
}
};
Thread thread = new Thread(runnable);
thread.start();
}
private void getContentList() {
try {
String json = HttpUtilities.get(CONTENTS_URL);
Log.i("Konu", "İndirildi " + json);
final List<Content> contentList = JsonManager
.parseGetContentJson(json);
Log.i("Konu", "Ayrıştırılan adet " + contentList.size());
Runnable action = new Runnable() {
@Override
public void run() {
for (Content c : contentList) {
willSHownText = willSHownText + " "
+ c.getContentTitle();
}
textView.setText(willSHownText);
}
};
runOnUiThread(action);
} catch (Exception e) {
Log.e("Konu", "İndirme hatası" + e.getClass().getName()
+ " " + e.getMessage(), e);
}
}
}
Yukarıdaki örnekde olduğu gibi webden içerik almak isterseniz thread açıcaksınız.İçeriği aldıktan sonra arayuzde göstermek istioyrsanız tekrarthread açmak zorundasınız. android.os.NetworkOnMainThreadException Hatasının çözümü budur.