簡體   English   中英

Android中如何處理沒有互聯網和丟失的連接?

[英]How to handle with no Internet and lost connection in Android?

我有一個應用程序需要連接到Internet以執行某些操作,但是當沒有Internet可用時它將崩潰。 我讀過,如果沒有互聯網,我需要使用try catch括號。 我試圖使用它,你可以在AsyncTask中看到,但它不起作用。 我不知道為什么。 該應用程序崩潰。 如何處理try catch將它放在我的代碼中?

如果應用程序在進程正在進行時丟失了Internet連接,那還有一件事情。 我怎么想處理這件事所以我的應用程序不會崩潰。 非常感謝你。

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

這是我的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)

您可以創建method ,也可以在某些類中將方法實例化為static方法。

這是一個名為isConnectedToInternet()的方法,用於檢查Internet是否已連接。 基於連接回調用函數返回布爾值。

片段:

 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還是拋出一些彈出窗口。 在這里,我已經添加了用戶來引入他的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;

    }
}

使用此課程檢查互聯網可用性,如:

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修復它,請參閱。 如果不這樣做,則會出現更大的問題,因為UnknownHostExceptionIOException的子類,您已經捕獲了它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM