0

アンドロイドで安らかな春を使用すると問題が発生します。
そのような私のコード。
1.アクティビティ

public class TestRestTemplate extends Activity {
    final static String TAG = "TestRestTemplate";

    TextView tvResult;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_rest_template);

        tvResult = (TextView) findViewById(R.id.result);
    }

    public void onClick(View view) {
        new MyTask().execute("test");
    }

    private class MyTask extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            // The URL for making the POST request
            String url = CommonUtilities.SERVER_URL + "/testRestTemplate";

            HttpHeaders requestHeaders = new HttpHeaders();

            // Sending a JSON or XML object i.e. "application/json" or
            // "application/xml"
            requestHeaders.setContentType(MediaType.APPLICATION_JSON);

            // Populate the Message object to serialize and headers in an
            // HttpEntity object to use for the request
            String returnObj = null;
            try {
                HttpEntity<String> requestEntity = new HttpEntity<String>(
                        params[0], requestHeaders);

                // Create a new RestTemplate instance
                RestTemplate restTemplate = new RestTemplate(true);

                // Make the network request, posting the message, expecting
                // a String in response from the server
                returnObj = restTemplate.postForObject(url, requestEntity,
                        String.class);
            }catch (NullPointerException e) {
                throw new RuntimeException("resttemplate errors");
            }catch (Exception e) {
                Log.e(TAG + "-Exception", "" + e.getMessage());
            }
            return returnObj;
        }

        @Override
        protected void onPostExecute(String result) {
            tvResult.append("\n" + result);
        }
    }   
}

2.そしてtest_rest_template.xmlファイル:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="Request Server" />

    <TextView
        android:id="@+id/result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Result::" />

</LinearLayout>

3.サーバー側

@Controller
public class HomeController {

    private static final Logger logger = LoggerFactory
            .getLogger(HomeController.class);

    int count = 0;
    @RequestMapping(value = "/testRestTemplate", method=RequestMethod.POST, headers="Accept=application/json")
    public @ResponseBody String getDataFromClient(@RequestBody String clientData) {

        logger.info("request " + (++count) + " times");

        return count + " times request and return client data = " + clientData;
    }
}

問題は、最初にボタンをクリックするとサーバーに接続して文字列に正常に応答することですが、その後21秒以上待ってからボタンをクリックすると、logcatで例外が発生しました。

12-12 13:56:30.246: W/dalvikvm(1796): threadid=12: thread exiting with uncaught exception (group=0x40a13300)
12-12 13:56:30.266: E/AndroidRuntime(1796): FATAL EXCEPTION: AsyncTask #2
12-12 13:56:30.266: E/AndroidRuntime(1796): java.lang.RuntimeException: An error occured while executing doInBackground()
12-12 13:56:30.266: E/AndroidRuntime(1796):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
12-12 13:56:30.266: E/AndroidRuntime(1796):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
12-12 13:56:30.266: E/AndroidRuntime(1796):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
12-12 13:56:30.266: E/AndroidRuntime(1796):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
12-12 13:56:30.266: E/AndroidRuntime(1796):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
12-12 13:56:30.266: E/AndroidRuntime(1796):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
12-12 13:56:30.266: E/AndroidRuntime(1796):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
12-12 13:56:30.266: E/AndroidRuntime(1796):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
12-12 13:56:30.266: E/AndroidRuntime(1796):     at java.lang.Thread.run(Thread.java:856)
12-12 13:56:30.266: E/AndroidRuntime(1796): Caused by: java.lang.RuntimeException: resttemplate errors
12-12 13:56:30.266: E/AndroidRuntime(1796):     at vn.com.bip.personal_schedule.activity.TestRestTemplate$MyTask.doInBackground(TestRestTemplate.java:68)
12-12 13:56:30.266: E/AndroidRuntime(1796):     at vn.com.bip.personal_schedule.activity.TestRestTemplate$MyTask.doInBackground(TestRestTemplate.java:1)
12-12 13:56:30.266: E/AndroidRuntime(1796):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
12-12 13:56:30.266: E/AndroidRuntime(1796):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
12-12 13:56:30.266: E/AndroidRuntime(1796):     ... 5 more

私はこのパターンを約2日間グーグルで検索しましたが、役立つ提案は見つかりませんでした。あなたの誰もが私にこの問題を説明することができます。
前もって感謝します。

4

2 に答える 2

0

完全な答えではないかもしれませんが、上記の問題を解決する方法を見つけました。
RestTemplateSimpleClientHttpRequestFactoryは Android 2.3 (GINGERBREAD) 以降およびHttpComponentsClientHttpRequestFactory2.3 未満の Android バージョンで使用されるため、強制的に RestTemplateHttpComponentsClientHttpRequestFactoryをこのコードとして使用する必要があります

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
RestTemplate restTemplate = new RestTemplate(true, requestFactory);

問題は解決しました。
問題が発生した理由を突き止めるには十分な時間がありません。それについて知っている専門家がいる場合は、共有してください 。よろしくお願いします

于 2012-12-13T04:56:18.007 に答える
0

残りのリクエストをデバッグするには、HttpURLConnection を使用し、結果を文字列としてログに記録します。これにより、何が起こっているかを追跡できます。解析関連のエラーが発生しているようです。

RoboSpiceを使用して休憩リクエストを実行することを検討しましたか? AsyncTask よりも優れています。

于 2012-12-12T07:26:17.300 に答える