【问题标题】:Android: handle unexpected internet disconnect while downloading dataAndroid:在下载数据时处理意外的互联网断开连接
【发布时间】:2010-03-31 02:26:10
【问题描述】:

我这里有一个从远程服务器下载数据到文件的功能。我仍然对我的代码没有信心。我的问题是,如果在读取流并将数据保存到文件时突然我在互联网上断开连接,下面的这些捕获异常真的可以捕获这种事件吗?如果没有,您能否建议如何处理此类事件?

注意:我在一个线程中调用这个函数,这样 UI 就不会被阻塞。

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;

        }

【问题讨论】:

    标签: java android exception-handling


    【解决方案1】:

    在开始网络通信之前,我使用以下 sn-p 检查网络是否可用(预防胜于治疗?)。一旦通信开始,我只能希望网络始终保持可用。如果没有,我会捕获抛出的异常并向用户显示一条消息。

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

    【讨论】:

    • 你能举一些关于如何创建 DefaultThreadHandler 的例子吗?我没有创建它的经验。谢谢。
    • 我自己没有在代码中使用过它们(仅在理论上知道它们),但我认为使用它们非常简单。我在上面编辑了我的答案;看看吧。
    猜你喜欢
    • 2018-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多