如何处理,没有互联网,失去了在Android的连接? [英] How to handle with no Internet and lost connection in Android?

查看:131
本文介绍了如何处理,没有互联网,失去了在Android的连接?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个需要连接到互联网来执行一些动作,但是当没有可用的互联网会崩溃的应用程序。我读,我需要使用尝试捕捉挡片,没有互联网。我试图使用它,你可以在AsyncTask的看到,但它不工作。我不知道为什么。该应用程序崩溃。如何处理尝试捕捉到哪里把它放在我的code?

还有一件事是什么样,如果应用程序没有网络连接,而过程是怎么回事。如何应该我来处理这件事情让我的应用程序不会崩溃。非常感谢你。

 保护无效的onCreate(包savedInstanceState){
  super.onCreate(savedInstanceState);
  的setContentView(R.layout.home);
  LV =(ListView控件)findViewById(R.id.mybookslistview);

  新connectToServer()执行();
}


类connectToServer扩展的AsyncTask<虚空,虚空,虚空> {
  CustomListViewAdapter适配器;
  HTT presponse响应;
  @覆盖
    保护无效doInBackground(虚空...... PARAMS){
      ids_list.clear();
      names_list.clear();
      writers_list.clear();

      HttpClient的客户端=新DefaultHttpClient();
      HttpPost后=新HttpPost(链接);
      ArrayList的<的NameValuePair>名单=新的ArrayList<的NameValuePair>();
      list.add(新BasicNameValuePair(文字,connectionPurpose));
      尝试 {
        post.setEntity(新UrlEn codedFormEntity(列表,HTTP.UTF_8));
        响应= client.execute(后);
        的BufferedReader BR =新的BufferedReader(新的InputStreamReader(response.getEntity()的getContent()));
        SB =新的StringBuffer();
        字符串的TempVar =;
        而((TempVar的= br.readLine())!= NULL){
          sb.append(TempVar的);
        }
      }赶上(UnsupportedEncodingException E){
        e.printStackTrace();
      }赶上(ClientProtocolException E){
        e.printStackTrace();
      }赶上(IOException异常E){
        e.printStackTrace();
      }
      //从StringBuffer的获取数据,并把它放在数组列表
      如果(!sb.toString()。修剪()。contentEquals(空)){
        content_array = sb.toString()分裂()。
        对于(INT S = 0; S< content_array.length; S ++){
          如果(content_array [秒]。载( - )){
            串温度[] = content_array [秒] .split( - );
            ids_list.add(温度[0] .trim());
            names_list.add(温度[1] .trim());
            writers_list.add(温度[2] .trim());
          }
        }
      }
      返回null;
    }

  @覆盖
    保护无效onPostExecute(无效的结果){
      super.onPostExecute(结果);

      connManager =(ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE);
      mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

      如果(!mWifi.isConnected()){
        ADB =新AlertDialog.Builder(Home.this);
        adb.setMessage(لايوجدإنترنتقمبتفعيلالإنترنتثمحاولمرةأخرى。);
        adb.setPositiveButton(حاولمجددا,新DialogInterface.OnClickListener(){

            @覆盖
            公共无效的onClick(DialogInterface为arg0,INT ARG1){
            新connectToServer()执行();
            }
            });
        adb.setNegativeButton(إغلاقالتطبيق,新DialogInterface.OnClickListener(){

            @覆盖
            公共无效的onClick(DialogInterface对话,诠释它){
            完();
            }
            });
        //这表明,如果没有连接对话框
        。adb.create()显示();
      }其他{
        名单=新的ArrayList< Home.ListViewItem>();
        为(X = 0; X  - 其中; ids_list.size(); X ++){
          list.add(新的ListViewItem(){{bookname的= names_list.get(X); writerName = writers_list.get(X);}});
        }
        适配器=新CustomListViewAdapter(Home.this,清单);
        lv.setAdapter(适配器);
        如果(sb.toString()。修剪()。contentEquals(空)){
          Toast.makeText(Home.this,لاتوجدنتائج。,​​Toast.LENGTH_LONG).show();
        }
      }
 

这是我的logcat:

 的java.net.UnknownHostException:无法解析主机globalmall.ca:没有与主机名关联的地址
    在java.net.InetAddress.lookupHostByName(InetAddress.java:424)
    在java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
    在java.net.InetAddress.getAllByName(InetAddress.java:214)
    在org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
    在org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    在org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    在org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670)
    在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509)
    在org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    在readit.Mansour.inc.Home $ connectToServer.doInBackground(Home.java:106)
    在readit.Mansour.inc.Home $ connectToServer.doInBackground(Home.java:1)
    在android.os.AsyncTask $ 2.call(AsyncTask.java:287)
    在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:305)
    在java.util.concurrent.FutureTask.run(FutureTask.java:137)
    在android.os.AsyncTask $ SerialExecutor $ 1.运行(AsyncTask.java:230)
    在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:569)
    在java.lang.Thread.run(Thread.java:856)
 致:libcore.io.GaiException:的getaddrinfo失败:EAI_NODATA(不与主机名关联的地址)
    在libcore.io.Posix.getaddrinfo(本机方法)
    在libcore.io.ForwardingOs.getaddrinfo(ForwardingOs.java:55)
    在java.net.InetAddress.lookupHostByName(InetAddress.java:405)
    ... 18更多
 libcore.io.ErrnoException:产生的原因的getaddrinfo失败:ENETUNREACH(网络不可达)
    ... 21更多
主题ID = 13:螺纹未捕获异常退出(组= 0x40e582a0)
 

解决方案

您可以创建方法或某些类可能是在那里你可以实例方法,静态

下面是一个名为 isConnectedToInternet()一种方法,检查是否网络连接或没有。返回布尔连接的基础上返回给调用函数。

摘录:

 公共布尔isConnectedToInternet(){
    ConnectivityManager连接=(ConnectivityManager)getApplicationContext()getSystemService(Context.CONNECTIVITY_SERVICE)。
      如果(连接!= NULL)
      {
          的NetworkInfo []信息= connectivity.getAllNetworkInfo();
          如果(资讯!= NULL)
              的for(int i = 0; I< info.length;我++)
                  如果(资讯[I] .getState()== NetworkInfo.State.CONNECTED)
                  {
                      返回true;
                  }

      }
      返回false;
}
 

您可以 isConnectedToInternet的返回值()的基础上,决定是否执行 AysncTask 或扔了一些流行音乐向上。在这里,我一直在增加用户带来了他的数据设置

的类似:

 如果(isConnectedToInternet())
   {
      //运行的AsyncTask
    }
   其他
   {
      //这里,我增加了意图开拓数据设置
   意向意图=新的意图(Settings.ACTION_MAIN);
   组件名CNAME =新的组件名(com.android.phone,com.android.phone.NetworkSetting);
   intent.setComponent(CNAME);
    }
 


正如你所提到的,如果你失去的之间的连接。您可以检查状态code按的HttpClient的作出反应并相关信息弹出用户。 您可以在 AysncTask 整合这些片段。

  DefaultHttpClient的HttpClient =新DefaultHttpClient();
  HTT presponse响应= NULL;
  响应= httpclient.execute(HTTPGET);
  。INT code = response.getStatusLine()的getStatus code();
 

I have an application that needs to connect to the Internet to perform some actions but when no Internet available it will crash. I read that I need to use try catch bracket in case no Internet. I tried to use it as you can see in AsyncTask but it doesn't work. I don't know why. The app crashes. How to deal with try catch where to put it in my code?

One more thing what about if the app lost Internet connection while process is going on. How supposed I to deal with this thing so my app doesn't crash. Thank you very much.

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();
        }
      }

This is my logcat:

 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)

解决方案

You can either create method or some class may be where you can instantiate method as static.

Here is a method named isConnectedToInternet() which checks whether internet is connected or not. Return boolean on the basis of connection back to the calling function.

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;
}

You can decide on the basis of return value of isConnectedToInternet() whether to execute AysncTask or Throw some pop up. Here i've been added user to brought in his Data Settings.

Something like these:

  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); 
    }


As you mentioned what if you looses connection in between. You can check the status code as per the reponse of httpclient and pop up relevant information to user. You can integrate these snippet under AysncTask.

  DefaultHttpClient httpclient  = new DefaultHttpClient();
  HttpResponse response = null;
  response = httpclient.execute(httpget);
  int code = response.getStatusLine().getStatusCode();

这篇关于如何处理,没有互联网,失去了在Android的连接?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆