2011-12-31 39 views
0

私はAPIからフェッチするためにSAXParserFactoryとXMLリーダーを使用しています。しかし、インターネット接続がダウンすると、スタックされてアプリケーションがクラッシュしてしまいます。例外処理の概念はあまりよくありません。誰もが解決策を見つけるのを助けることができます。私はその操作を停止し、接続が失敗したときにカスタムメッセージを表示したい。 助けてください。 非常に緊急..接続に失敗しましたか?

答えて

1

あなたが行うことができます

try { 
    ... do the IO and SAX parsing 
} catch (Exception e) { 
    Toast.makeToast(context, "Failure: " + e.getMessage(), Toast.LENGTH_SHORT).show(); 
} 

のようなものがあること言った:アンドロイド3以降では、ネットワークIOが(ときにシステムアプリを殺すバックグラウンドタスクにする必要がありますUIスレッドでネットワークIOを行う)、ioをバックグラウンドで置く必要があります。これは定義上UIにアクセスできません。

ここで(擬似コード)のようなパターンを助けることができる:

class MyAsyncTask extends AsyncTask { 

    String doInBackground() { 

    try {  
     ... do IO/parsing 
    } 
    catch (Exception e) { 
     return e.getMessage(); 
    } 
    return "ok"; 
    } 

    onPostExecute(String in) { 
    Toast.makeToas(... in ...); 
    } 
} 
0

ここでは、Androidでネットワーク通信を実行する方法を詳細サンプルコードである:

try { 
url = new URL(ForumURL); 
URLConnection connection = url.openConnection(); 
//Set connection time out to 10 secs 
HttpURLConnection httpConnection = (HttpURLConnection) connection; 
httpConnection.setConnectTimeout(10*1000); 

int responseCode = httpConnection.getResponseCode();  
if(responseCode == HttpURLConnection.HTTP_OK) 
{ 
    InputStream in = httpConnection.getInputStream(); 

    DocumentBuilderFactory dbf; 
    dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 

    Document dom = db.parse(in); 
} //You can put an else condition here, if you want to process any error situations. 

} catch (Exception e) { 
    //Your exception handler code here. 
    return; 
    }//catch (Exception e)  

注意の言葉。 Androidでネットワーク通信を行うときは、メインのUIスレッドではなく、別のスレッドを使用して行います。この理由は、遅いネットワークでネットワーク操作を実行すると、アンドロイドOSによってANRでアプリが強制終了されるためです。

+0

'catch(Exception e) 'を介してすべての例外をキャッチすることは非常に悪いことです。あなたは 'IOException'や他のより特定の例外をうまく捕らえるべきです。例えば、 'OutOfMemoryException'は他の部分であなたのプログラムを破壊するでしょう。 – rekire

関連する問題