首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使在使用AsyncTask时也要使用NetworkOnMainThread

即使在使用AsyncTask时也要使用NetworkOnMainThread
EN

Stack Overflow用户
提问于 2015-03-07 21:28:42
回答 2查看 43关注 0票数 0

在下面的代码中,当我运行我的Android项目读取Json时,我得到了一个错误,它显示了NetworkOnMainThread异常,我使用了异步任务,并试图启用严格模式,但没有任何帮助

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2015-03-07 21:40:43

您在Upravljanje的构造函数中执行网络I/O,并且在主应用程序线程上执行该构造函数。让该网络I/O在doInBackground()提供的线程上执行。

此外,正如beigleux所指出的,您正在尝试修改doInBackground()中的UI (TextView小部件)。这是行不通的。将该代码移动到AsyncTask子类的onPostExecute()方法中。

您可能希望回顾一下the documentation for AsyncTask

票数 0
EN

Stack Overflow用户

发布于 2015-03-07 21:47:52

将您的代码更改为:

代码语言:javascript
复制
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()方法中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28915368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档