Volley HTTP 라이브러리를 사용하여 Android 활동에서이 코드를 고려하십시오. HTTP 요청이 완료되지 않습니다. 정상 응답이나 오류 응답을 수신하지 않습니다. 그러나 while (!done)
블록을 주석 처리하면 모든 것이 정상적으로 완료됩니다. 이것은 Volley 이후 나는 완전히 별도의 스레드가 HTTP 요청을 수행하는 데 사용되는 스레드 풀을 포함하는 RequestQueue
을 만들고 있습니다. 그렇다면이 스레드가 잠자고 있으면 요청이 끝나지 않는 이유는 무엇입니까?왜이 Android Volley 요청이 완료되지 않습니까?
코드 :
package com.adobe.instore.activities;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import com.adobe.instore.R;
import com.adobe.instore.Urls;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONObject;
public class VolleyTestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_volley_test);
}
private static boolean done = false;
protected void makeRequest(View v) {
Log.i(getLocalClassName(), "Request");
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
queue.start();
queue.add(new JsonObjectRequest(Request.Method.GET, Urls.STATIC_URL + "/profiles.json", null, new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
Log.i(getLocalClassName(), "Response");
done = true;
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(getLocalClassName(), "Error");
}
}));
Log.i(getLocalClassName(), "Awaiting completion");
while(!done) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.i(getLocalClassName(), "Done");
}
}
왜 끝내지 않는다고 말합니까? – josedlujan
@josedlujan logcat 콘솔에 예상 텍스트를 인쇄하지 않으면 응용 프로그램이 멈 춥니 다. –
while 루프를 제거하면 주 스레드를 차단합니다. – Enzokie