2015-04-13 2 views
-1

Я получаю NetworkOnMainThreadException при запуске моего кода. У меня есть Fragment, где я показываю некоторый идентификатор из веб-сервисов, который вызывается, когда я нажимаю кнопку. Следующий мой код. Я использовал Asynctask, как упоминалось для этой цели, но все же я продолжаю получать эту ошибку.NetworkOnMainThread Exception android studio

public class AboutMeFragView extends Fragment implements ObsrvIntModel { 

    private Button getConfButton; 
    private UsrDataCtrl m_UsrDataCtrl; 
    private UsrDataModel m_UsrDataModel; 
    private boolean m_bResUpdate; 
    private String retc; 

    public static AboutMeFragView newInstance() { 
     AboutMeFragView aboutMeFragment = new AboutMeFragView(); 
     return aboutMeFragment; 
    } 

    public AboutMeFragView() {} 

    //inflate the data on this view from the relevant xml file fragment_about_me.xml 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     final View rootView = inflater.inflate(R.layout.fragment_about_me, container, false); 

     getConfButton = (Button) rootView.findViewById(R.id.get_config_button); 

     getConfButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Toast.makeText(getActivity(), "Implement methods to get the configuration", Toast.LENGTH_LONG).show(); 
       //call your model to get the data from the server and show it on the UI 
       enableStrictMode(); 
       new GetCredsTask().execute(); 

      } 
     }); 

     return rootView; 
    } 

    //whenever fragment is associated with our main activity 
    //following method would get called 
    //also we make sure here that whatever navigation activity is selected 
    //our action bar shows up the same activity name 


    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 

     ((CpActivity)activity).onSectionAttached(1); 
    } 


    @Override 
    public void update(boolean result) { 
      m_bResUpdate = result; 
    } 

    public void enableStrictMode() 
    { 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 

     StrictMode.setThreadPolicy(policy); 
    } 


    private class GetCredsTask extends AsyncTask<Void, Void, String> { 

     public GetCredsTask() { 
      super(); 
     } 

     @Override 
     protected String doInBackground(Void... params) { 
      m_UsrDataModel = new UsrDataModel(AboutMeFragView.this); 
      m_UsrDataCtrl = new UsrDataCtrl(m_UsrDataModel); 
      m_UsrDataCtrl.execConfig(); 

      retc = m_UsrDataModel.getM_authid(); 

      if(m_bResUpdate != true) { 
       retc = "404"; 
      } 
      Log.d("doInBackground", retc); 
      return retc; 
     } 


     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      Log.d("onPostExecute", retc); 
      if (m_bResUpdate == true) 
       Toast.makeText(getActivity(), s, Toast.LENGTH_LONG).show(); 
      else 
       Toast.makeText(getActivity(), retc, Toast.LENGTH_LONG).show(); 

      super.onPostExecute(s); 
     } 


     @Override 
     protected void onProgressUpdate(Void... values) { 
      super.onProgressUpdate(values); 
     } 

     protected void execute() { 
      doInBackground(); 
     } 
    } 
} 

Благодаря

+0

Нет, потому что я уже проверил эту нить. Я думаю, что ничего не пропустил, но все, что я пропустил, надеюсь получить отсюда помощь! Спасибо – k2ibegin

+3

Удалить "protected void execute() { doInBackground(); }" Метод. Не нужно переопределять его. –

ответ

2

Вы перекрывая execute(), который вызывает задачу, которая будет размещена на главном потоке, а не выполняется в фоновом режиме. Нормальные сообщения реализации Казнь задачи на фоне потока, т.е.

Edit:

public final AsyncTask<Params, Progress, Result> More ...execute(Params... params) { 
     return executeOnExecutor(sDefaultExecutor, params); 
    } 
+0

Спасибо большое! Тем не менее, у меня есть вопрос из любопытства. Как мы знаем, что переопределение выполнения или другие возможные вещи могут привести к тому, что наш код будет выполняться в основном потоке пользовательского интерфейса? Любая помощь оценивается. – k2ibegin

+1

Вы можете проверить петлитель или поток, что вы используете Looper.getMainLooper(). Equals (Looper.myLooper()). Для получения дополнительной информации см. Ссылку Looper. Все методы жизненного цикла по умолчанию запускаются в основном потоке, поэтому, если вы не отправляете исполнение в отдельный поток, просто предположите, что он работает в основном потоке, если вы вызываете метод из одного из ваших методов жизненного цикла. – Submersed

Смежные вопросы