3

FacebookグラフAPIにHTTP-getリクエストを送信しています。

約1/5回で、私のコードは決してに到達しませんLog.i("debug", "resp");。例外はスローされません。いけませんか?それとも、デフォルトでは非常に長いタイムアウトですか?

カスタムタイムアウトを追加すると(以下を参照)、例外がスローされます。ただし、コードがtry + catchステートメントでラップされていても、でエラーを処理させるのではなく、アプリがクラッシュします(未処理の例外の場合と同様)onPostExecute()。なぜ私はその方法に終わらないのですか?

protected Map<String, Integer> doInBackground(Void... params) {

    Map<String, Integer> result = new HashMap<String, Integer>();

    try {

        HttpGet get = new HttpGet("https://graph.facebook.com/....etc");

        //final HttpParams httpParams = httpclient.getParams();
        //HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
        //HttpConnectionParams.setSoTimeout(httpParams, 5000);

        HttpResponse response = httpclient.execute(get);
        Log.i("debug", "resp");  

        HttpEntity resEntityGet = response.getEntity();

        //do stuff with resEntityGet           

        return result;            

    } catch (Exception e) { 
        Toast.makeText(mainActivity, "Error: " + ex.getMessage(), Toast.LENGTH_LONG).show();
        return null;
    }
}

protected void onPostExecute(Map<String, Integer> result) {

    if(result != null){
        //use the result data
    } else {
        //exception occured
    }
}
4

5 に答える 5

1

UIスレッドに投稿するとToast、メソッドからを表示できます。doInBackgroundそれを行うにはいくつかの方法がありますが、ここに1つの方法があります。

mainActivity.runOnUiThread( new Runnable() {

    @Override
    public void run() {
        Toast.makeText(mainActivity, "Error: " + ex.getMessage(), Toast.LENGTH_LONG).show();
    }
} );

Exception変数を作成する必要がありますfinal

于 2012-12-07T20:53:04.733 に答える
0

あなたのコードは正しいですが、それは明確で安全ではありません。タイムアウトを設定しない場合は、デフォルト値0に設定されます。タイムアウト値0は、無限のタイムアウトとして解釈されます。その場合、何らかの理由で応答データに問題が発生すると、クライアントが中断されるか、何もわかりません。ケース2-最悪の場合-クライアントは例外をスローせず、プログラムは永久に存続します。この問題を解決するには、すべてを取得またはサーバーに送信するときにタイムアウトを設定する必要があります。安全です。クライアントが例外なく永遠に生きる原因を正確に知りません。サーバーの問題かネットワークの問題だと思います。希望があなたを助けることができます。

于 2012-12-12T10:25:43.070 に答える
0

自分で考え出した。でトーストを作成できないことがわかりましたdoInBackground()。これが他の誰かに役立つことを願っています。

于 2012-12-05T18:59:01.183 に答える
0

この方法で例外を処理するときにも同じ問題に直面しました

public class ServerCheckingActvity extends Activity{
    ProgressDialog  progress;
    static String constant="";
    Map<String, Integer> result;
    @Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
     new MyAsynchTask().execute();
}

private  class MyAsynchTask extends AsyncTask<Void,Void,String>{
    @Override
    protected void onPreExecute(){
           progress=new ProgressDialog(ServerCheckingActvity.this);
           // progress.setTitle(" DATA RETRIVEING");
            progress.setMessage("please wait........");
            progress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
            progress.setCancelable(true);
            progress.show();
            super.onPreExecute();
    }

    @Override
    protected String doInBackground(Void... params) {
        String view="";

        try {
            DefaultHttpClient httpClient = new DefaultHttpClient();

            HttpGet get = new HttpGet("www.facebook .com/...........");

            //final HttpParams httpParams = httpclient.getParams();
            //HttpConnectionParams.setConnectionTimeout(httpParams, 5000);
            //HttpConnectionParams.setSoTimeout(httpParams, 5000);

            HttpResponse response =httpClient.execute(get);
            Log.i("debug", "resp");  

            HttpEntity resEntityGet = response.getEntity();

            //do stuff with resEntityGet           

           // assigen ur value to result map object here;    
            result = new HashMap<String, Integer>();


        } catch (Exception e) { 
            constant="Exception";
            //Toast.makeText(mainActivity, "Error: " + ex.getMessage(), Toast.LENGTH_LONG).show();
            //return null;
        }
        return view="from doing background";
    }
    @Override
    protected void onPostExecute(String view ){
        if(constant=="Exception"){
            constant="";
            Toast.makeText(getApplicationContext(), "server problem", Toast.LENGTH_LONG).show();

        }else if(result != null){
            //use the result data
        } else {
            //exception occured
        }
    }

}
于 2012-12-08T06:06:55.233 に答える
0
catch (Exception ex) {
       // execep is here string variable u declare in globally
       execep=ex.getMessage();
      runOnUiThread( new Runnable() {
   @Override
public void run() {
  Toast.makeText(  getApplicationContext(), "Error: " +execep, Toast.LENGTH_LONG).show();
                                        }} );

                               }//catch
于 2012-12-08T06:28:11.640 に答える