2013-09-27 65 views
13

Tôi có một ứng dụng cần kết nối Internet để thực hiện một số hành động nhưng khi không có Internet, nó sẽ bị lỗi. Tôi đọc rằng tôi cần phải sử dụng thử bắt khung trong trường hợp không có Internet. Tôi đã cố gắng sử dụng nó như bạn có thể thấy trong AsyncTask nhưng nó không hoạt động. Tôi không biết tại sao. Ứng dụng gặp sự cố. Làm thế nào để đối phó với cố gắng bắt nơi để đặt nó trong mã của tôi?Làm thế nào để xử lý không có Internet và mất kết nối trong Android?

Một điều nữa nếu ứng dụng bị mất kết nối Internet trong khi quá trình đang diễn ra. Làm thế nào tôi phải đối phó với điều này để ứng dụng của tôi không sụp đổ. Cảm ơn nhiều.

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

Đây là logcat của tôi:

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) 
+0

Vì vậy, căn cứ vào logcat, có thể giúp bạn chỉ ra những gì dòng trong mã nguồn của bạn là dòng # 106? –

+0

@TassosBassoukos Đang thêm StringBuffer. \t \t \t \t while ((tempVar = br.readLine())! = Null) { \t \t \t \t \t \t sb.append (tempVar);} –

+0

UnknownHostException không bị bắt kịp. – Reinherd

Trả lời

6

Bạn có thể tạo method hoặc một số lớp có thể là nơi bạn có thể khởi tạo phương thức là static.

Đây là phương pháp có tên isConnectedToInternet() để kiểm tra xem internet có được kết nối hay không. Trả về boolean trên cơ sở kết nối trở lại hàm gọi.

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

Bạn có thể quyết định trên cơ sở giá trị trả về của isConnectedToInternet() liệu để thực hiện AysncTask hoặc Ném một số pop-up. Ở đây tôi đã được thêm người dùng để đưa vào Data Settings của mình.

Something như thế này:

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

Như bạn nói gì nếu bạn thua kết nối ở giữa. Bạn có thể kiểm tra mã trạng thái theo phản hồi của httpclient và bật thông tin có liên quan cho người dùng. Bạn có thể tích hợp các đoạn mã này dưới AysncTask.

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

Đó có vẻ là một giải pháp tốt nhưng nếu bị mất kết nối thì sao? –

+0

@MansourFahad: Tôi đã thêm đoạn trích vào OP của bạn trong nhận xét. –

+0

Đối với kết nối mất sử dụng BroadcastReceiver với bộ lọc này: android.net.conn.CONNECTIVITY_CHANGE –

0

Thú vị. Bạn có trong ngăn xếp của bạn theo dõi những dòng này:

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

Mà có nghĩa là dòng vi phạm là

response = client.execute(post); 

Đó là khác biệt so với các dòng mà bạn đề cập. Xác minh dấu vết ngăn xếp & dòng mà nó đề cập. Ngoài ra, hãy xem rằng nếu bạn khắc phục bằng cách bắt số Exception. Nếu bạn không, thì bạn có một vấn đề lớn hơn, bởi vì UnknownHostException là một phân lớp của IOException, mà bạn đã nắm bắt.

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

Hope this helps ..

Các vấn đề liên quan