2010-03-31 18 views
8

मेरे पास एक ऐसा फ़ंक्शन है जो दूरस्थ सर्वर से डेटा डाउनलोड करने के लिए डाउनलोड करता है। मुझे अभी भी मेरे कोड से भरोसा नहीं है। मेरा सवाल यह है कि, क्या होगा अगर स्ट्रीम को पढ़ने और डेटा को डेटा में सहेजते समय अचानक मैं इंटरनेट से डिस्कनेक्ट हो गया था, तो क्या इन पकड़ अपवादों को वास्तव में उस तरह की घटना को पकड़ सकता है? यदि नहीं, तो क्या आप इस तरह की घटना को संभालने का सुझाव दे सकते हैं?एंड्रॉइड: डेटा डाउनलोड करते समय अप्रत्याशित इंटरनेट डिस्कनेक्ट को संभालें

नोट: मैं इस फ़ंक्शन को थ्रेड में कॉल करता हूं ताकि यूआई अवरुद्ध न हो।

public static boolean getFromRemote(String link, String fileName, Context context){ 
     boolean dataReceived = false; 
     ConnectivityManager connec = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 

      if (connec.getNetworkInfo(0).isConnected() || connec.getNetworkInfo(1).isConnected()){ 
       try { 
         HttpClient httpClient = new DefaultHttpClient(); 
         HttpGet httpGet = new HttpGet(link); 
         HttpParams params = httpClient.getParams(); 
         HttpConnectionParams.setConnectionTimeout(params, 30000); 
         HttpConnectionParams.setSoTimeout(params, 30000); 
         HttpResponse response; 
         response = httpClient.execute(httpGet); 
         int statusCode = response.getStatusLine().getStatusCode(); 
         if (statusCode == 200){ 
          HttpEntity entity = response.getEntity(); 



          InputStream in = null; 
          OutputStream output = null; 

          try{ 
           in = entity.getContent(); 

           String secondLevelCacheDir = context.getCacheDir() + fileName; 

           File imageFile = new File(secondLevelCacheDir); 

           output= new FileOutputStream(imageFile); 
           IOUtilities.copy(in, output); 
           output.flush(); 
          } catch (IOException e) { 
           Log.e("SAVING", "Could not load xml", e); 
          } finally { 
           IOUtilities.closeStream(in); 
           IOUtilities.closeStream(output); 
           dataReceived = true; 

          } 
         } 
        }catch (SocketTimeoutException e){ 
         //Handle not connecting to client !!!! 
         Log.d("SocketTimeoutException Thrown", e.toString()); 
         dataReceived = false; 

        } catch (ClientProtocolException e) { 
         //Handle not connecting to client !!!! 
         Log.d("ClientProtocolException Thrown", e.toString()); 
         dataReceived = false; 

        }catch (MalformedURLException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
         dataReceived = false; 
         Log.d("MalformedURLException Thrown", e.toString()); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
         dataReceived = false; 
         Log.d("IOException Thrown", e.toString()); 
        } 
       } 
      return dataReceived; 

     } 

उत्तर

5

मैं अगर नेटवर्क उपलब्ध है इससे पहले कि मैं एक नेटवर्क संचार शुरू की जांच करने के लिए निम्न का उपयोग करते हैं (रोकथाम इलाज से बेहतर?)। संचार शुरू होने के बाद, मैं केवल उम्मीद कर सकता हूं कि नेटवर्क पूरे समय उपलब्ध रहेगा। यदि नहीं, तो मैं अपवाद को फेंक दूंगा और उपयोगकर्ता को एक संदेश प्रदर्शित करूंगा।

public boolean isNetworkAvailable() { 
    Context context = getApplicationContext(); 
    ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (connectivity == null) { 
     boitealerte(this.getString(R.string.alert),"getSystemService rend null"); 
    } else { 
     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; 
} 

आप किसी भी धागा है जो किसी भी अपवाद अपवाद जुटाने कोड में ध्यान में न आया जाना अगर इस्तेमाल किया जाएगा के साथ एक DefaultThreadHandler संलग्न कर सकते हैं।

[संपादित करें: जोड़ना नमूना कोड]

//attaching a Handler with a thread using the static function 
Thread.setDefaultUncaughtExceptionHandler(handler); 

//creating a Handler 
private Thread.UncaughtExceptionHandler handler= 
     new Thread.UncaughtExceptionHandler() { 
     public void uncaughtException(Thread thread, Throwable ex) { 
      Log.e(TAG, "Uncaught exception", ex); 
      showDialog(ex); 
     } 
    }; 

void showDialog(Throwable t) { 
     AlertDialog.Builder builder=new AlertDialog.Builder(mContext); 
      builder 
       .setTitle("Exception") 
       .setMessage(t.toString()) 
       .setPositiveButton("Okay", null) 
       .show(); 
    } 
+0

आप कैसे एक DefaultThreadHandler बनाने संबंधी कुछ उदाहरण दे सकते हैं? मुझे इसे बनाने का अनुभव नहीं है। धन्यवाद। – capecrawler

+0

मैंने उन्हें कोड में स्वयं नहीं उपयोग किया है (उन्हें केवल सिद्धांत में जानते हैं) लेकिन मुझे लगता है कि उनका उपयोग करना काफी सीधे है। मैंने ऊपर अपना जवाब संपादित किया है; जरा देखो तो। – Samuh

संबंधित मुद्दे