Как обращаться без Интернета и потерянного соединения в Android?

У меня есть приложение, которое необходимо подключиться к Интернету для выполнения некоторых действий, но когда нет доступа к Интернету, он будет аварийно завершен. Я прочитал, что мне нужно использовать скотч catch catch в случае отсутствия Интернета. Я попытался использовать его, как вы можете видеть в AsyncTask, но он не работает. Я не знаю, почему. Приложение аварийно завершает работу. Как бороться с попыткой поймать, куда положить его в мой код?

Еще одна вещь о том, что приложение потеряло подключение к Интернету во время процесса. Как я должен иметь дело с этой штукой, чтобы мое приложение не разбилось. Большое спасибо.

protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.home); lv = (ListView) findViewById(R.id.mybookslistview); new connectToServer().execute(); } class connectToServer extends AsyncTask<Void, Void, Void>{ CustomListViewAdapter adapter; HttpResponse response; @Override protected Void doInBackground(Void... params) { ids_list.clear(); names_list.clear(); writers_list.clear(); HttpClient client = new DefaultHttpClient(); HttpPost post = new HttpPost(link); ArrayList<NameValuePair> list = new ArrayList<NameValuePair>(); list.add(new BasicNameValuePair(word, connectionPurpose)); try { post.setEntity(new UrlEncodedFormEntity(list, HTTP.UTF_8)); response = client.execute(post); BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); sb = new StringBuffer(); String tempVar = ""; while((tempVar = br.readLine()) != null){ sb.append(tempVar); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //Get data from stringbuffer and put it in array list if(!sb.toString().trim().contentEquals("null")){ content_array = sb.toString().split(","); for(int s = 0; s < content_array.length; s++){ if(content_array[s].contains("-")){ String temp[] = content_array[s].split("-"); ids_list.add(temp[0].trim()); names_list.add(temp[1].trim()); writers_list.add(temp[2].trim()); } } } return null; } @Override protected void onPostExecute(Void result) { super.onPostExecute(result); connManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if(!mWifi.isConnected()){ adb = new AlertDialog.Builder(Home.this); adb.setMessage("لا يوجد إنترنت. قم بتفعيل الإنترنت ثم حاول مرة أخرى."); adb.setPositiveButton("حاول مجددا", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { new connectToServer().execute(); } }); adb.setNegativeButton("إغلاق التطبيق", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); //It shows dialog if no connection adb.create().show(); }else{ list = new ArrayList<Home.ListViewItem>(); for(x = 0; x < ids_list.size(); x++){ list.add(new ListViewItem(){{bookName = names_list.get(x); writerName = writers_list.get(x);}}); } adapter = new CustomListViewAdapter(Home.this, list); lv.setAdapter(adapter); if(sb.toString().trim().contentEquals("null")){ Toast.makeText(Home.this, "لا توجد نتائج.", Toast.LENGTH_LONG).show(); } } 

Это мой логарифм:

  java.net.UnknownHostException: Unable to resolve host "globalmall.ca": No address associated with hostname at java.net.InetAddress.lookupHostByName(InetAddress.java:424) at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) at java.net.InetAddress.getAllByName(InetAddress.java:214) at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) at readit.Mansour.inc.Home$connectToServer.doInBackground(Home.java:106) at readit.Mansour.inc.Home$connectToServer.doInBackground(Home.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:287) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) at java.util.concurrent.FutureTask.run(FutureTask.java:137) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) at java.lang.Thread.run(Thread.java:856) Caused by: libcore.io.GaiException: getaddrinfo failed: EAI_NODATA (No address associated with hostname) at libcore.io.Posix.getaddrinfo(Native Method) at libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55) at java.net.InetAddress.lookupHostByName(InetAddress.java:405) ... 18 more Caused by: libcore.io.ErrnoException: getaddrinfo failed: ENETUNREACH (Network is unreachable) ... 21 more threadid=13: thread exiting with uncaught exception (group=0x40e582a0) 

Вы можете либо создать method либо некоторый класс, где вы можете создать метод как static .

Вот метод с именем isConnectedToInternet() который проверяет, подключен ли интернет или нет. Возвращает логическое значение на основе подключения к вызывающей функции.

Snippet:

  public boolean isConnectedToInternet(){ ConnectivityManager connectivity = (ConnectivityManager)getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo[] info = connectivity.getAllNetworkInfo(); if (info != null) for (int i = 0; i < info.length; i++) if (info[i].getState() == NetworkInfo.State.CONNECTED) { return true; } } return false; } 

Вы можете решить на основе возвращаемого значения isConnectedToInternet() следует ли запускать AysncTask или Throw some pop up. Здесь я добавил пользователя, чтобы Data Settings .

Что-то вроде этого:

  if(isConnectedToInternet()) { // Run AsyncTask } else { // Here I've been added intent to open up data settings Intent intent=new Intent(Settings.ACTION_MAIN); ComponentName cName = new ComponentName("com.android.phone","com.android.phone.NetworkSetting"); intent.setComponent(cName); } 

Как вы сказали, что, если вы потеряете соединение между ними. Вы можете проверить код состояния в соответствии с ответом httpclient и вывести соответствующую информацию пользователю. Вы можете интегрировать эти фрагменты под AysncTask .

  DefaultHttpClient httpclient = new DefaultHttpClient(); HttpResponse response = null; response = httpclient.execute(httpget); int code = response.getStatusLine().getStatusCode(); 
 public class CheckNetClass { public static Boolean checknetwork(Context mContext) { NetworkInfo info = ((ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE)) .getActiveNetworkInfo(); if (info == null || !info.isConnected()) { return false; } if (info.isRoaming()) { // here is the roaming option you can change it if you want to // disable internet while roaming, just return false return true; } return true; } } use this class to check internet availability like if (CheckNetClass.checknetwork(getApplicationContext())) { new GetCounterTask().execute(); } else { Toast.makeText(getApplicationContext(),"Sorry,no internet connectivty",1).show(); } 

Надеюсь это поможет..

Интересно. У вас в вашем стеке трассируются следующие строки:

 org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) readit.Mansour.inc.Home$connectToServer.doInBackground(Home.java:106) 

Это означает, что нарушающая

 response = client.execute(post); 

Это отличается от строки, о которой вы говорили. Проверьте трассировку стека и строку, которую он упоминает. Кроме того, посмотрите, если вы исправите это, перехватив Exception . Если вы этого не сделаете, у вас UnknownHostException большая проблема, потому что UnknownHostException – это подкласс IOException , который вы уже поймали.