在下面的代码中,当我运行我的Android项目读取Json时,我得到了一个错误,它显示了NetworkOnMainThread异常,我使用了异步任务,并试图启用严格模式,但没有任何帮助
public class Recepti extends Activity {
TextView tablica,tablica1,cijena,opis;
Upravljanje up= new Upravljanje();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recepti);
cijena=(TextView) findViewById(R.id.textView4);
tablica1=(TextView) findViewById(R.id.textView2);
tablica=(TextView) findViewById(R.id.textView1);
opis=(TextView) findViewById(R.id.textView3);
new Asink().execute();
}
protected class Asink extends AsyncTask<Void,Void,Void>{
@Override
protected Void doInBackground(Void... voids) {
tablica.setText(up.getData());
tablica1.setText(up.getData1());
opis.setText(up.opis());
return null;
}
}
}
and heres the part of code that logcat led me to
public Upravljanje(){
try{
HttpClient klijent = new DefaultHttpClient();
HttpPost post =new HttpPost("http://localhost/series/nabavisastojke.php");
HttpResponse response = klijent.execute(post);
if(response!=null) {
HttpEntity entitet = response.getEntity();
isr=entitet.getContent();
}else{
Log.e("log..tag","no response" );
}
}catch(Exception e){
Log.e("log..tag","error in connecting"+e.toString() );
}注意:我在这里只写了localhost,在我的应用程序中我写了ip adress
发布于 2015-03-07 21:40:43
您在Upravljanje的构造函数中执行网络I/O,并且在主应用程序线程上执行该构造函数。让该网络I/O在doInBackground()提供的线程上执行。
此外,正如beigleux所指出的,您正在尝试修改doInBackground()中的UI (TextView小部件)。这是行不通的。将该代码移动到AsyncTask子类的onPostExecute()方法中。
您可能希望回顾一下the documentation for AsyncTask。
发布于 2015-03-07 21:47:52
将您的代码更改为:
public class Recepti extends Activity {
TextView tablica,tablica1,cijena,opis;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recepti);
cijena=(TextView) findViewById(R.id.textView4);
tablica1=(TextView) findViewById(R.id.textView2);
tablica=(TextView) findViewById(R.id.textView1);
opis=(TextView) findViewById(R.id.textView3);
new Asink().execute();
}
protected class Asink extends AsyncTask<Void,Void,Void>{
@Override
protected Void doInBackground(Void... voids) {
Upravljanje up= new Upravljanje();
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
tablica.setText(up.getData());
tablica1.setText(up.getData1());
opis.setText(up.opis());
}
}你犯了两个错误:
1-你已经在主线程中初始化了Upravljanje类。
2-您在doInBackground()中使用了setText()方法,但该方法不起作用。您必须将这些代码移到onPostExecute()方法中。
https://stackoverflow.com/questions/28915368
复制相似问题