2013-05-24 3 views
0

Я нашел несколько вопросов в stackOverflow, связанных с этой темой, но не смог найти подходящий ответ. В моем приложении я намерен делать сетевые коммуникации через отдельный поток. Так что я использовал asynctask. Но даже после с помощью AsyncTask я нашел networkOnMainThreadException.Here мой код:NetworkOnMainThreadException даже после использования asynctask

private static final String CATEGORY_ALL_FETCHING_URL = "http://qpon.es/coupon/index.php/welcome/categories/all"; 
private static final String CATEGORY_IMAGE_URL = "http://qpon.es/images/coupons/"; 
private static final String TAG_CATEGORY_ID = "id"; 
private static final String TAG_CATEGORY_NAME = "name"; 
private static final String TAG_CATEGORY_IMAGE = "img"; 
private static final String TAG_CATEGORY_CREATE_DATE = "created"; 
private static final String CATEGORY_INTENT = "category"; 

private ProgressDialog downloadingStatusIndicator = null; 
private ArrayList<Category> categoryList = null; 
private CustomCategoryAdapter customAdapter = null; 

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

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     downloadingStatusIndicator = new ProgressDialog(getActivity()); 
     downloadingStatusIndicator.setTitle(R.string.categoryDownloadTitle); 
     downloadingStatusIndicator.setMessage("Retrieving Categories..."); 
     downloadingStatusIndicator.show(); 

    } 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     String response = ""; 
     try { 

      Log.d("BACK THREAD STARTS", "YES"); 
      categoryList = new ArrayList<Category>(); 
      response = JSONParser 
        .getRemoteResponse(CATEGORY_ALL_FETCHING_URL); 

      // Thread.sleep(2000); 
     } catch (Exception e) { 

      Log.d("BACKGROUD", e.getMessage()); 
     } 

     return response; 
    } 

    @Override 
    protected void onPostExecute(String response) { 

     JSONArray categoriesJSON = null; 
     try { 
      categoriesJSON = new JSONArray(response); 
     } catch (JSONException e) { 
      Log.e("JSON Parser", "Error parsing data " + e.toString()); 
     } 

     for (int i = 0; i < categoriesJSON.length(); i++) { 

      Log.d("LOOP BEGINS", "YES"); 
      Category eachCategory = new Category(); 

      JSONObject eachCategoryJSON = null; 
      try { 
       eachCategoryJSON = categoriesJSON.getJSONObject(i); 
       eachCategory.setCategoryName(eachCategoryJSON 
         .getString(TAG_CATEGORY_NAME)); 
       eachCategory.setCategoryCreateDate(eachCategoryJSON 
         .getString(TAG_CATEGORY_CREATE_DATE)); 
       eachCategory.setCategoryImagePath(CATEGORY_IMAGE_URL 
         + eachCategoryJSON.getString(TAG_CATEGORY_IMAGE)); 
       eachCategory.setCategoryID(eachCategoryJSON 
         .getInt(TAG_CATEGORY_ID)); 
      } catch (JSONException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      categoryList.add(eachCategory); 
      Log.d("CATEGORY INSERTED", categoryList.toString()); 
     } 

     Log.d("CATEGORY LIST", categoryList.toString()); 

     if (categoryList != null || categoryList.size() > 0) { 
      customAdapter.notifyDataSetChanged(); 

      for (int i = 0; i < categoryList.size(); i++) { 
       customAdapter.add(categoryList.get(i)); 

      } 

      downloadingStatusIndicator.dismiss(); 
      customAdapter.notifyDataSetChanged(); 
     } 

     Toast.makeText(getActivity(), response, Toast.LENGTH_SHORT).show(); 

    } 

} 

в setRemoteRenponse JSONParder в() метод:

boolean isURLFetched = false; 

    while(!isURLFetched){ 

     DefaultHttpClient client = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 
     try { 
      HttpResponse execute = client.execute(httpGet); 
      content = execute.getEntity().getContent(); 
      isURLFetched = true; 

     } catch (UnsupportedEncodingException e) { 

      Log.d("HERE", "ONE"); 
      e.printStackTrace(); 
     } catch (ClientProtocolException e) { 

      Log.d("HERE", "TWO"); 
      e.printStackTrace(); 
     } catch (IOException e) { 

      Log.d("HERE", "THREE"); 
      e.printStackTrace(); 
     } 
    } 

    try { 

     BufferedReader buffer = new BufferedReader(new InputStreamReader(
       content)); 
     String s = ""; 
     while ((s = buffer.readLine()) != null) { 
      response += s; 
     } 

    } catch (Exception e) { 
     Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

    return response; 

Наконец объект класса AsyncTask создается & выполняется в е метод onActivityCreated():

CateoryListDataGenerator dataGenerator = new CateoryListDataGenerator(); 
dataGenerator.execute(new String[] { CATEGORY_ALL_FETCHING_URL });  

Я делаю что-то неправильно здесь? Я также включил разрешение INTERNET. Теперь я изменил политику потока для работы этого приложения на Android 3.0 или выше, но это не решение.

Вот сообщение LogCat:

05-24 17:11:36.025: E/AndroidRuntime(708): FATAL EXCEPTION: main 
05-24 17:11:36.025: E/AndroidRuntime(708): android.os.NetworkOnMainThreadException 
05-24 17:11:36.025: E/AndroidRuntime(708): at  android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
05-24 17:11:36.025: E/AndroidRuntime(708): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
05-24 17:11:36.025: E/AndroidRuntime(708): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
05-24 17:11:36.025: E/AndroidRuntime(708): at java.net.InetAddress.getAllByName(InetAddress.java:214) 
05-24 17:11:36.025: E/AndroidRuntime(708): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 
05-24 17:11:36.025: E/AndroidRuntime(708): at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
05-24 17:11:36.025: E/AndroidRuntime(708): at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:341) 
05-24 17:11:36.025: E/AndroidRuntime(708): at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
05-24 17:11:36.025: E/AndroidRuntime(708): at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
05-24 17:11:36.025: E/AndroidRuntime(708): at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 
05-24 17:11:36.025: E/AndroidRuntime(708): at libcore.net.http.HttpEngine.connect(HttpEngine.java:310) 
05-24 17:11:36.025: E/AndroidRuntime(708): at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 
05-24 17:11:36.025: E/AndroidRuntime(708): at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 
05-24 17:11:36.025: E/AndroidRuntime(708): at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 
05-24 17:11:36.025: E/AndroidRuntime(708): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
05-24 17:11:36.025: E/AndroidRuntime(708): at com.example.couponapp.adapters.CustomCategoryAdapter.getScaledBitmapFromFile(CustomCategoryAdapter.java:83) 
05-24 17:11:36.025: E/AndroidRuntime(708): at com.example.couponapp.adapters.CustomCategoryAdapter.getView(CustomCategoryAdapter.java:58) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.AbsListView.obtainView(AbsListView.java:2267) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.ListView.makeAndAddView(ListView.java:1769) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.ListView.fillDown(ListView.java:672) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.ListView.fillFromTop(ListView.java:733) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.ListView.layoutChildren(ListView.java:1608) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.AbsListView.onLayout(AbsListView.java:2102) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.View.layout(View.java:13754) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.ViewGroup.layout(ViewGroup.java:4362) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:948) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.View.layout(View.java:13754) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.ViewGroup.layout(ViewGroup.java:4362) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.View.layout(View.java:13754) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.ViewGroup.layout(ViewGroup.java:4362) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.View.layout(View.java:13754) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.ViewGroup.layout(ViewGroup.java:4362) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.LinearLayout.onLayout(LinearLayout.java:1420) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.View.layout(View.java:13754) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.ViewGroup.layout(ViewGroup.java:4362) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.FrameLayout.onLayout(FrameLayout.java:448) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.View.layout(View.java:13754) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.ViewGroup.layout(ViewGroup.java:4362) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1866) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1687) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:998) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4212) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.Choreographer.doCallbacks(Choreographer.java:555) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.Choreographer.doFrame(Choreographer.java:525) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.os.Handler.handleCallback(Handler.java:615) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.os.Looper.loop(Looper.java:137) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.app.ActivityThread.main(ActivityThread.java:4745) 
05-24 17:11:36.025: E/AndroidRuntime(708): at java.lang.reflect.Method.invokeNative(Native Method) 
05-24 17:11:36.025: E/AndroidRuntime(708): at java.lang.reflect.Method.invoke(Method.java:511) 
05-24 17:11:36.025: E/AndroidRuntime(708): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
05-24 17:11:36.025: E/AndroidRuntime(708): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
05-24 17:11:36.025: E/AndroidRuntime(708): at dalvik.system.NativeStart.main(Native Method) 
+3

Пожалуйста, разместите всю трассировку стека. – CommonsWare

+0

где вы вызываете setRemoteRenponse()? – Raghunandan

+0

@ Raghunandan вероятно Он имел в виду getRemoteRenponse()? – Blackbelt

ответ

3

Похоже, что проблема не здесь. Из бревен, внутри адаптера,

 
05-24 17:11:36.025: E/AndroidRuntime(708): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
05-24 17:11:36.025: E/AndroidRuntime(708): at com.example.couponapp.adapters.CustomCategoryAdapter.getScaledBitmapFromFile(CustomCategoryAdapter.java:83) 
05-24 17:11:36.025: E/AndroidRuntime(708): at com.example.couponapp.adapters.CustomCategoryAdapter.getView(CustomCategoryAdapter.java:58) 
05-24 17:11:36.025: E/AndroidRuntime(708): at android.widget.AbsListView.obtainView(AbsListView.java:2267) 

Вы можете видеть, что метод GetView() пытается загрузить изображение, которое, в свою очередь, делает запрос сети для извлечения изображения из где-то.

Проверьте, что именно вы здесь делаете.

 
com.example.couponapp.adapters.CustomCategoryAdapter.getScaledBitmapFromFile(CustomCategoryAdapter.java:83) 
05-24 17:11:36.025: E/AndroidRuntime(708): at com.example.couponapp.adapters.CustomCategoryAdapter.getView(CustomCategoryAdapter.java:58) 

В методе getScaledBitmapFromFile, я подозреваю, что вы делаете сетевой вызов, который находится на UIThread.

+0

Спасибо !! .... @ Kumar Bibek. вы правы. Мне нужно загрузить изображение в отдельном потоке. Но хотя я прокомментировал часть загрузки изображения, мой логарифм по-прежнему показывает: «Вы, возможно, слишком много работаете над своим основным потоком». Он должен быть показали?Я все еще новичок в использовании asynctask, поэтому простите меня, если вопрос глупо ... :) – SALEH

+0

Да. Просто игнорируйте эти предупреждения. –

2

Пожалуйста, поместите код в onPostExecute обратно в doInBackground и верните результат, который вы хотите поместить в свой адаптер в onPostExecute.

Ваша проблема должна быть JSONArray, см. Документацию ... ее небезопасно;).

+0

Как и Кумар Бибек, getScaledBitmapFromFile (...) также может быть проблемой. NetworkOnThreadMainException также вызывается File-Operations! – Luserdroid

0

Если ответ Luserdroid не был ясен, то: Вы должны поместить ваш код обработки внутри doInBackground, я сделал ошибку, поставив код обработки внутри onPostExecute, который выполняется основным потоком и, следовательно, я получал один и тот же вопрос.

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