2017-01-30 5 views
0

Я пытаюсь использовать AsyncTask, это работает, когда устройство имеет подключение к Интернету, но когда я открываю, что без Интернета появляется это сообщение «К сожалению, остановилось», следуйте коду, что я делаю неправильно? может кто-нибудь объяснить мне?AsyncTask Test Connection

PS: У меня есть одно действие, и я работаю с AsyncTask внутри фрагмента.

Фрагмент, который использует AsyncTask.

public class MasonFragment extends Fragment { 

private ListView lstMason; 
private ProgressDialog dialog; 

//private Fragment fragmentMain = new MainFragment(); 

public MasonFragment() { 
    // Required empty public constructor 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_mason, container, false); 

    lstMason = (ListView)view.findViewById(R.id.lstMason); 

    // Create default options which will be used for every 
    // displayImage(...) call if no options will be passed to this method 
    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisk(true).build(); 
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getActivity()) 
      .defaultDisplayImageOptions(defaultOptions).build(); 
    ImageLoader.getInstance().init(config); // Do it on Application start 
    //To that class work need this: compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' in gradle module 

    new JSONTask().execute("https://deliveryteste.000webhostapp.com/production_version_1/json_services_v1.txt"); 

    return view; 

} 

/*private View.OnClickListener requestJSON = new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 

     new JSONTask().execute("My_URL"); 

    } 
};*/ 

public class JSONTask extends AsyncTask<String, String, List<Services>> { 

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

    @Override 
    protected List<Services> doInBackground(String... params) { 

     if(new CheckNetwork(getActivity()).isNetworkAvailable()) { 

      HttpURLConnection connection = null; 
      BufferedReader reader = null; 

      try { 
       URL url = new URL(params[0]); 
       connection = (HttpURLConnection) url.openConnection(); 
       connection.connect(); 

       InputStream stream = connection.getInputStream(); 
       reader = new BufferedReader(new InputStreamReader(stream)); 

       StringBuffer buffer = new StringBuffer(); 

       String line = ""; 
       while ((line = reader.readLine()) != null) { 

        buffer.append(line); 

       } 

       String finalJson = buffer.toString(); 

       JSONObject jsonObject = new JSONObject(finalJson); 

       JSONArray jsonArray = jsonObject.getJSONArray("mason"); 

       List<Services> servicesList = new ArrayList<>(); 


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

        JSONObject finalObject = jsonArray.getJSONObject(i); 

        Services services = new Services(); 

        services.setName(finalObject.getString("name")); 
        services.setTelephone(finalObject.getString("telephone")); 
        services.setCity(finalObject.getString("city")); 
        services.setDescription(finalObject.getString("description")); 
        services.setRating((float) finalObject.getDouble("rate")); 
        services.setImage(finalObject.getString("image")); 
        services.setFacebook(finalObject.getString("facebook")); 

        servicesList.add(services); 

       } 


       return servicesList; 

      } catch (MalformedURLException e) { 

       e.printStackTrace(); 

      } catch (IOException e) { 

       e.printStackTrace(); 

      } catch (JSONException e) { 

       e.printStackTrace(); 
       //backToMain(); 

      } finally { 
       if (connection != null) { 
        connection.disconnect(); 
       } 
       try { 
        if (reader != null) { 

         reader.close(); 
        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } else { 

      Toast.makeText(getActivity(), "Por favor esteja conectado com a rede!", Toast.LENGTH_LONG).show(); 

     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(List<Services> result) { 
     super.onPostExecute(result); 
     ServicesAdapter servicesAdapter = new ServicesAdapter(getActivity(), R.layout.custom_listview, result); 
     lstMason.setAdapter(servicesAdapter); 
    } 
} 

//Class to CustomArrayAdapter 
public class ServicesAdapter extends ArrayAdapter { 

    private List<Services> servicesList; 
    private int resource; 
    private LayoutInflater inflater; 
    public ServicesAdapter(Context context, int resource, List<Services> objects) { 
     super(context, resource, objects); 
     servicesList = objects; 
     this.resource = resource; 
     inflater = (LayoutInflater) getActivity().getSystemService(LAYOUT_INFLATER_SERVICE); 

    } 

    @NonNull 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if(convertView == null){ 

      convertView = inflater.inflate(resource, null); 

     } 

     ImageView imgPerson; 
     TextView lblName; 
     TextView lblTelephone; 
     TextView lblDescription; 
     TextView lblFacebookResult; 
     TextView lblCity; 
     RatingBar rtgServiceRating; 

     imgPerson = (ImageView)convertView.findViewById(R.id.imgPerson); 
     lblName = (TextView)convertView.findViewById(R.id.lblName); 
     lblTelephone = (TextView)convertView.findViewById(R.id.lblTelephone); 
     lblCity = (TextView)convertView.findViewById(R.id.lblCity); 
     lblDescription = (TextView)convertView.findViewById(R.id.lblDescription); 
     lblFacebookResult = (TextView)convertView.findViewById(R.id.lblFacebookResult); 
     rtgServiceRating = (RatingBar)convertView.findViewById(R.id.rtgSerciveRating); 

     // Then later, when you want to display image 
     ImageLoader.getInstance().displayImage(servicesList.get(position).getImage(), imgPerson); // Default options will be used 

     lblName.setText(servicesList.get(position).getName()); 
     lblTelephone.setText(String.valueOf(servicesList.get(position).getTelephone())); 
     lblDescription.setText(servicesList.get(position).getDescription()); 
     lblFacebookResult.setText(servicesList.get(position).getFacebook()); 
     lblCity.setText(servicesList.get(position).getCity()); 

     //Rating Bar 
     rtgServiceRating.setRating(servicesList.get(position).getRating()); 

     StringBuffer stringBuffer = new StringBuffer(); 

     return convertView; 
    } 
} 

/*private void backToMain(){ 

     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.lnlContentMain, fragmentMain).commit(); 

}*/ 

Класс, чтобы проверить подключение к сети: журнал

public class CheckNetwork { 

private Context context; 

public CheckNetwork(Context context) { 
    this.context = context; 
} 

public boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
} 

Ошибка:

01-30 17:30:13.886 6868-7284/com.archtech.gabrielgomes.hirehere E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
                       Process: com.archtech.gabrielgomes.hirehere, PID: 6868 
                       java.lang.RuntimeException: An error occured while executing doInBackground() 
                        at android.os.AsyncTask$3.done(AsyncTask.java:300) 
                        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
                        at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
                        at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                        at java.lang.Thread.run(Thread.java:841) 
                       Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10204 nor current process has android.permission.ACCESS_NETWORK_STATE. 
                        at android.os.Parcel.readException(Parcel.java:1472) 
                        at android.os.Parcel.readException(Parcel.java:1426) 
                        at android.net.IConnectivityManager$Stub$Proxy.getActiveNetworkInfo(IConnectivityManager.java:1139) 
                        at android.net.ConnectivityManager.getActiveNetworkInfo(ConnectivityManager.java:690) 
                        at com.archtech.gabrielgomes.hirehere.CheckNetwork.isNetworkAvailable(CheckNetwork.java:21) 
                        at com.archtech.gabrielgomes.hirehere.fragments.MasonFragment$JSONTask.doInBackground(MasonFragment.java:100) 
                        at com.archtech.gabrielgomes.hirehere.fragments.MasonFragment$JSONTask.doInBackground(MasonFragment.java:90) 
                        at android.os.AsyncTask$2.call(AsyncTask.java:288) 
                        at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
                        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
                        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
                        at java.lang.Thread.run(Thread.java:841)  

Спасибо вам, ребята.

+1

Возможный дубликат [Ни пользователь, ни текущий процесс имеет android.permission.ACCESS \ _COARSE \ _LOCATION] (HTTP: //stackoverflow.com/questions/26312733/neither-user-nor-current-process-has-android-permission-access-coarse-location) – petey

+0

проверить разрешение в файле манифеста. –

ответ

1

Как говорится об ошибках, java.lang.SecurityException: ConnectivityService: Neither user 10204 nor current process has android.permission.ACCESS_NETWORK_STATE

Чтобы исправить это просто добавить <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> в файл AndroidManifest.xml

+0

Эй, Айзек, это не решило мою проблему. –

+0

Появляется ли у вас другое сообщение об ошибке? Можете ли вы обновить свой вопрос? – Isaac