0

У меня есть setUserVisibleHint (логическое isVisibleToUser) фрагмента в Android, который, если «True» делает HttpURLConnection к удаленной базе данных и извлечения данных. Однако я получаю сообщение об ошибке data = getJSONData(); (Строка 14). У меня нет какой-либо ошибки компиляции, но во время выполнения она терпит неудачу, может ли кто-нибудь помочь мне с ошибкой, которую я делаю.NetworkOnMainThreadException в setUserVisibleHint фрагмента в Android

Полный код заключается в следующем:

public class Cafeteria extends Fragment { 

InputStream in = null; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View fragView = inflater.inflate(R.layout.commonlayout, container, false); 
    return fragView; 
} 

@Override 
public void setUserVisibleHint(boolean isVisibleToUser){ 
    super.setUserVisibleHint(isVisibleToUser); 
    if(isVisibleToUser){ 
     MainActivity.googleMap.clear(); 
     String data= null; 
     try { 
      data = getJSONData(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     MarkerDisplay(data); 
    } 
    else{} 

} 

private String getJSONData() throws IOException{ 
    String myurl = "http://10.52.23.10/project/getCafeteriaData.php"; 

    URL url = new URL(myurl); 
    HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 

    try{ 
    conn.setDoInput(true); 
    conn.setRequestMethod("GET"); 

    if (conn.getResponseCode()==200){ 
     in= conn.getInputStream(); 
    } 
    else{ 
     Log.d("DEBUG_TAG", "The Response Code Obtained is: " +conn.getResponseCode()); 
    } 
    in = new BufferedInputStream(in); 
    InputStreamReader is = new InputStreamReader(in); 
    BufferedReader br = new BufferedReader(is); 
    String read = br.readLine(); 

    return read; 
    } 
    finally { 
     conn= null; 
    } 
} 

public void MarkerDisplay(String read) { 
    String str1= read; // Odata is original Stream Data 
    double slat, slng; 
    String sdesc; 
    try { 
     String delimiters1 = " "; 
     String[] str2 = str1.split(delimiters1); 

     for (int i = 0; i < str2.length; i++){ 
      String delimiters2 = ","; 
      String[] mappairs = str2[i].split(delimiters2); 
      //Convert all the string to double and int 
      slat = Double.parseDouble(mappairs[0].substring(8)); 
      slng = Double.parseDouble(mappairs[1].substring(9)); 
      sdesc=mappairs[2].substring(11); 

      LatLng latLngob = new LatLng(slat, slng); 
      MainActivity.googleMap.addMarker(new MarkerOptions().position(new LatLng(slat, slng)).icon(BitmapDescriptorFactory.fromResource(R.drawable.cafeteriamarker)).title(sdesc)); 
      }//else completes 
    }//try ends here 
    catch (Exception e) { 
e.printStackTrace(); 
    } 
} 

} 
+10

Возможный дубликат [Как исправить android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/как к FIX-андроид-Os-networkonmainthreadexception) – Nirekin

ответ

1

попробовать так:

public class MyAsync extends AsyncTask<Void, Void, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     String str = ""; 
     try{ 
     str = getJSONData(); 
     }catch(Exception e){} 
     return str; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
    // use result here 
    } 
} 
Смежные вопросы