2012-08-28 32 views
6

Tôi nhận được android.os.NetworkOnMainThreadException trong khi tôi đã viết mã hoạt động mạng trong AsynkTask. có lý do nào khác để ném ngoại lệ này không?Tại sao tôi nhận được android.os.NetworkOnMainThreadException với AsyncTask?

Đây là Mã của tôi:

public class Background_confirmation extends AsyncTask<Void, Integer, Void> { 
     @Override 
     protected void onPreExecute() { 
      // TODO Auto-generated method stub 
      progressDialog = ProgressDialog.show(Confirmation.this, 
        "Please wait...", "Retrieving data ...", true); 
      try { 
       HttpClient httpclient = new DefaultHttpClient(); 

       HttpPost httppost = new HttpPost(
         "http://68.121.167.160/sip_chat_api/create_account.php?useralias=" 
           + useralias + "&cntname=" + cntcode + ""); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
        is = entity.getContent(); 


      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      if (backgroung_flag == 1) { 

      } else { 
       if (is != null) { 
        try { 
         BufferedReader reader = new BufferedReader(
           new InputStreamReader(is, "UTF-8")); 
         StringBuilder sb = new StringBuilder(); 
         String line = null; 
         while ((line = reader.readLine()) != null) { 
          sb.append(line + "\n"); 
         } 
         is.close(); 

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

      } 
      super.onPreExecute(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // TODO Auto-generated method stub 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      // TODO Auto-generated method stub 
      if (progressDialog.isShowing()) { 
       progressDialog.dismiss(); 
       // progressDialog.setCancelable(true); 
      } 
      super.onPostExecute(result); 
     } 

    } 

Và tôi đang kêu gọi lớp này trong OnCreate()

new Background_confirmation().execute(); 

Nhưng nó luôn luôn đi trong khối Catch và mang lại cho tôi this ngoại lệ LogCat
Bất kỳ đề xuất và ý tưởng nào sẽ được đánh giá cao.
Cảm ơn

+0

Check-out Android Query cho các tác vụ này Async, đơn giản hoá tất cả. – jasonflaherty

Trả lời

4
public class Background_confirmation extends AsyncTask<Void, Integer, String> { 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

      progressDialog = ProgressDialog.show(Confirmation.this, "Please wait...", "Retrieving data ...", true); 

     } 

     @Override 
     protected String doInBackground(Void... params) { 

      try { 
       HttpClient httpclient = new DefaultHttpClient(); 

       HttpPost httppost = new HttpPost("http://68.121.167.160/sip_chat_api/create_account.php?useralias=" + useralias + "&cntname=" + cntcode + ""); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      if (backgroung_flag == 1) { 

      } else { 
       if (is != null) { 
        try { 
         BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
         StringBuilder sb = new StringBuilder(); 
         String line = null; 
         while ((line = reader.readLine()) != null) { 
          sb.append(line + "\n"); 
         } 
         is.close(); 

         result = sb.toString(); 
        } catch (Exception e) { 
         Log.e("log_tag", "Error converting result " + e.toString()); 
        } 
       } 
      } 
      return result; 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 

      if (progressDialog.isShowing()) { 
       progressDialog.dismiss(); 
       // progressDialog.setCancelable(true); 
      } 
     } 
    } 

Mã của bạn nên thay đổi như trên. Những điều bạn phải xem xét

  • Khả năng kết nối nên mã bên doInBackground()
  • Nếu bạn muốn nhận được kết quả của doInBackground(), bạn phải mang nó trong onPostExecute()
  • Điều đó có nghĩa bạn phải trả lại một giá trị String trong doInBackground() nơi tham số thứ ba của bạn của AsyncTask lớp nên được Chuỗi quá (mà không phải là trong câu trả lời của Wayne)

trong code của bạn, bạn đang gọi một InputStream rằng chúng ta không thể thấy ngoại trừ trong phần "khác". Nếu bạn đang sử dụng chỉ InputStream, hãy đảm bảo mã luôn tiếp cận phần còn lại.

+0

Cảm ơn nó đã làm việc tuyệt vời! Nếu tôi sử dụng mã của Dipak Keshariya để vô hiệu hóa chính sách strictMode thì nó có làm chậm hiệu suất của ứng dụng của tôi không? Bởi vì trong khi vô hiệu hóa StrictMode nó cho thấy rất nhiều dòng trong log.What là ý kiến ​​của bạn> – juned

+1

Đó là bình thường để hiển thị rất nhiều mã hóa trong khi sử dụng 'StrictMode'. Để kiểm tra hiệu suất trong thời gian chạy ở một mức độ nhất định, bạn có thể sử dụng ** Heap **, ** Trình theo dõi phân bổ ** như các chế độ xem trong chế độ ** DDMS ** trong Eclipse của bạn. – AnujAroshA

4

Bạn đã sử dụng phương pháp AsyncTask sai để đặt mã liên quan đến mạng của bạn. Vui lòng di chuyển nó đến doInBackground, vì onPreExecute diễn ra trên chuỗi chính. Vì vậy, ngoại lệ xảy ra. Chi tiết là here.

+0

Cảm ơn bạn đã trả lời nhưng nếu tôi đặt mã trong doInBackground() thì tôi không nhận được kết quả mong muốn – juned

+0

ý của bạn là gì theo 'kết quả mong muốn'? – sandrstar

1

Đặt tất cả mã yêu cầu mạng của bạn vào doInBackground. onPreExecuteonPostExecute sẽ chạy trên Giao diện người dùng (dòng chính), do đó bạn sẽ bị ngoại lệ nếu bạn yêu cầu mạng trên 2 phương pháp này.

public class Background_confirmation extends AsyncTask<Void, Integer, Void> { 
    @Override 
    protected void onPreExecute() {    
     progressDialog = ProgressDialog.show(Confirmation.this, 
       "Please wait...", "Retrieving data ...", true);    

    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     // TODO Auto-generated method stub 

     try { 
      HttpClient httpclient = new DefaultHttpClient(); 

      HttpPost httppost = new HttpPost(
        "http://68.121.167.160/sip_chat_api/create_account.php?useralias=" 
          + useralias + "&cntname=" + cntcode + ""); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     if (backgroung_flag == 1) { 

     } else { 
      if (is != null) { 
       try { 
        BufferedReader reader = new BufferedReader(
          new InputStreamReader(is, "UTF-8")); 
        StringBuilder sb = new StringBuilder(); 
        String line = null; 
        while ((line = reader.readLine()) != null) { 
         sb.append(line + "\n"); 
        } 
        is.close(); 

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

     } 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     if (progressDialog.isShowing()) { 
      progressDialog.dismiss(); 
      // progressDialog.setCancelable(true); 
     } 

    } 

} 
0

Guys những gì về tôi Tôi đang làm công việc mạng của tôi trong doInBackground() vẫn nhận được lỗi này trên dòng này BitmapFactory.decodeStream (url.openConnection(). GetInputStream());
mã của tôi là dưới

@Override 
    protected Void doInBackground(Void... voids) { 
     try { 
      RequestQueue queue = Volley.newRequestQueue(con); 
      StringRequest jsonArrayRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { 
       @Override 
       public void onResponse(String response) { 
        Log.e("Response: ",response.toString()); 
        //mProgressDialog.dismiss(); 

        try{long count; 
         String[] projection = { 
           columnid, 
           columnimage, 
           columnttitle, 
           columndesription, 
           columnurl 
         }; 
         SQLiteDatabase db=mdbHelper.getReadableDatabase(); 
         Cursor cursor=db.query(tablename, 
           projection, 
           null, 
           null, 
           null, 
           null, 
           null); 
         count=cursor.getCount(); 
         JSONObject jObject=new JSONObject(response); 
         String status=jObject.getString("status"); 
         String sortby=jObject.getString("sortBy"); 
         if(status.equals("ok")){ 
          JSONArray jsonArray= jObject.getJSONArray("articles"); 
          for(int i=0;i<jsonArray.length();i++){ 
           JSONObject jsonobject=jsonArray.getJSONObject(i); 
           Log.e("InnerData: ",jsonobject.toString()); 
           //NewsModel mDataList = new NewsModel(); 
           //mDataList.setDescription(jsonobject.getString("description")); 
           //mDataList.setTitle(jsonobject.getString("title")); 
           //mDataList.setUrl(jsonobject.getString("url")); 
           //mDataList.setUrltoimage(jsonobject.getString("urlToImage")); 
           cursor.moveToFirst(); 
           if(cursor.moveToFirst()){ 
            Log.d("yes cursor is null", cursor.toString()); 
           }else { Log.d("NO cursor is not null", cursor.toString());} 
           for(int j=0;j<=jsonArray.length();j++){ 
            SQLiteDatabase db1=mdbHelper.getWritableDatabase(); 
            if(count<=0){ 
             Id=1; 
             try { 
              URL url = new URL(jsonobject.getString("urlToImage")); 
              bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
             }catch (IOException e){e.printStackTrace();} 
             byte[] byteimage1=getBytes(bmp); 

             ContentValues values= new ContentValues(); 
             values.put(columnid,Id); 
             values.put(columnimage,byteimage1); 
             values.put(columnttitle,jsonobject.getString("title")); 
             values.put(columndesription,jsonobject.getString("description")); 
             values.put(columnurl,jsonobject.getString("url")); 
             long currentRow_ID=db1.insert(tablename,null,values); 
             if(Id!=currentRow_ID){ 
              Toast.makeText(con,"Error with saving news",Toast.LENGTH_LONG).show(); 
             } 
             else { 
              Toast.makeText(con,"You are having "+currentRow_ID+" News",Toast.LENGTH_LONG).show(); 
             } 
            } 
            if(count>0 && count<40){ 
             cursor.moveToPosition(j); 
             if((!(cursor.getString(cursor.getColumnIndex(columnttitle)).equals(jsonobject.getString("title")))) || (cursor.getInt(cursor.getColumnIndex(columnid))==0) || (cursor.getInt(cursor.getColumnIndex(columnid))==-1)){ 

              try { 
               URL url = new URL(jsonobject.getString("urlToImage")); 
               bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
              }catch (IOException e){e.printStackTrace();} 
              byte[] byteimage1=getBytes(bmp); 
              cursor.moveToLast(); 
              if(cursor.getInt(0)<=0) 
              {Id=1;} 
              else {Id=cursor.getInt(cursor.getColumnIndex(columnid))+1;} 
              ContentValues values= new ContentValues(); 
              values.put(columnid,Id); 
              values.put(columnimage,byteimage1); 
              values.put(columnttitle,jsonobject.getString("title")); 
              values.put(columndesription,jsonobject.getString("description")); 
              values.put(columnurl,jsonobject.getString("url")); 
              long currentRow_ID=db1.insert(tablename,null,values); 
              if(Id!=currentRow_ID){ 
               Toast.makeText(con,"Error with saving news",Toast.LENGTH_LONG).show(); 
              } 
              else { 
               Toast.makeText(con,"You are having "+currentRow_ID+" News",Toast.LENGTH_LONG).show(); 
              } 

             } 

            }else { cursor.moveToPosition(j); 

             if(!cursor.getString(cursor.getColumnIndex(columnttitle)).equals(jsonobject.getString("title"))){ 
              //cursor=db.rawQuery(" SELECT "+columnttitle+" FROM "+tablename+" WHERE "+columnid+" =?",new String[]{ String.valueOf(1) }); 
              db1.delete(tablename,columnid+"=?", new String[] { String.valueOf(1) }); 
              Log.d("record has been deleted",cursor.getString(cursor.getColumnIndex(columnttitle))); 
              long counttt=cursor.getCount(); 
              for(int k=2;k<=counttt;k++){ 
               ContentValues values= new ContentValues(); 
               values.put(columnid,--k); 
               db1.update(tablename,values,columnid +"="+k,null); 
              } 

              cursor.moveToLast(); 
              if(cursor.getInt(cursor.getColumnIndex(columnid))<40) {Id=cursor.getInt(cursor.getColumnIndex(columnid))+1;} 
              else {Toast.makeText(con," Record is not deleted",Toast.LENGTH_LONG).show(); 
               db1.delete(tablename,columnid+"=?", new String[] { String.valueOf(1) }); 
               for(int k=2;k<=counttt;k++){ 
                ContentValues values= new ContentValues(); 
                values.put(columnid,--k); 
                db1.update(tablename,values,columnid +"="+k,null); 
               } 
               Id=cursor.getInt(cursor.getColumnIndex(columnid))+1; 
              } 
              try { 
               URL url = new URL(jsonobject.getString("urlToImage")); 
               bmp1 = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
              }catch (IOException e){e.printStackTrace();} 
              byte[] byteimage1=getBytes(bmp1); 
              ContentValues values= new ContentValues(); 
              values.put(columnid,Id); 
              values.put(columnimage,byteimage1); 
              values.put(columnttitle,jsonobject.getString("title")); 
              values.put(columndesription,jsonobject.getString("description")); 
              values.put(columnurl,jsonobject.getString("url")); 
              long currentRow_ID=db1.insert(tablename,null,values); 
              if(Id!=currentRow_ID){ 
               Toast.makeText(con,"Error with saving news",Toast.LENGTH_LONG).show(); 
              } 
              else { 
               Toast.makeText(con,"You are having "+currentRow_ID+" News",Toast.LENGTH_LONG).show(); 
              } 

             } 
            } 
            if(j>=count){cursor.close(); 
             db1.close();} 
           } 
            /*for(int j=1;j<=count;j++){ 
             NewsModel model=new NewsModel(); 
             Cursor cursor1=db.rawQuery(" SELECT * FROM "+tablename+" WHERE "+columnid+"=?",new String[]{String.valueOf(j)}); 
             model.setTitle(cursor1.getString(cursor1.getColumnIndex(columnttitle))); 
             model.setDescription(cursor1.getString(cursor1.getColumnIndex(columndesription))); 
             model.setUrl(cursor1.getString(cursor1.getColumnIndex(columnurl))); 
             byte[] img = cursor1.getBlob(cursor1.getColumnIndex(columnimage)); 
             Bitmap bitmapimage= BitmapFactory.decodeByteArray(img,0,img.length); 
             model.setimage(bitmapimage); 
             mModelList.add(model); 
            } */ 

          } 

          //recyclerView.setAdapter(new Adapter(MainActivity.this,mModelList)); 

         } 

        }catch (NullPointerException ex){ 
         Log.e("Error ",ex.toString()); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 

       } 
      }, new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        //mProgressDialog.dismiss(); 
        if (error instanceof TimeoutError || error instanceof NoConnectionError) { 
         Toast.makeText(con, "Failed to fetch data." + 
           " Please check your network connection", Toast.LENGTH_SHORT).show(); 
        } else if (error instanceof AuthFailureError) { 
         //TODO 
        } else if (error instanceof ServerError) { 
         //TODO 
         Log.e("Server error",error.toString()); 
        } else if (error instanceof NetworkError) { 
         //TODO 
         Log.e("Network error",error.toString()); 
        } else if (error instanceof ParseError) { 
         //TODO 
         Log.e("Parse Error ",error.toString()); 
        } 
       } 
      }) { 

       @Override 
       protected Response<String> parseNetworkResponse(NetworkResponse response) { 
        if (response.headers == null) 
        { 
         // cant just set a new empty map because the member is final. 
         response = new NetworkResponse(
           response.statusCode, 
           response.data, 
           Collections.<String, String>emptyMap(), // this is the important line, set an empty but non-null map. 
           response.notModified, 
           response.networkTimeMs); 
        } 

        return super.parseNetworkResponse(response); 
       } 
      }; 

      //*********To Retry sending********************************************* 
      jsonArrayRequest.setRetryPolicy(new DefaultRetryPolicy(8000, 
        DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 
        DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 

      queue.add(jsonArrayRequest); 

     }catch (NullPointerException ex){ 

     }catch (IllegalFormatException ex){} 
     return null; 
    } 
+0

Nếu bạn có câu hỏi mới, vui lòng hỏi câu hỏi bằng cách nhấp vào nút [Hỏi câu hỏi] (https://stackoverflow.com/questions/ask). Bao gồm một liên kết đến câu hỏi này nếu nó giúp cung cấp ngữ cảnh. - [Từ đánh giá] (/ review/low-quality-posts/18856472) – rollstuhlfahrer

+0

câu hỏi của tôi liên quan đến câu hỏi này vì vậy tôi thêm câu hỏi của mình –

+0

tôi tìm thấy câu trả lời cho câu lệnh này nếu (android.os.Build.VERSION.SDK_INT> 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder(). AllowAll(). Build(); StrictMode.setThreadPolicy (chính sách); } 'thêm này vào onCreate() của bạn sau khi setContentView(); –

Các vấn đề liên quan