마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

네트워크 스레드 관련 질문이 있습니다 ㅠㅠ 간곡합니다.

0 추천
	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {

		View v = inflater.inflate(R.layout.signature, container, false);
		getDialog().setCanceledOnTouchOutside(false);
		Bundle mArgs = getArguments();
		imView = (ImageView) v.findViewById(R.id.btnCancel2);
		mRegularInfo = mArgs.getParcelable("regular");
		mLoginInfo = mArgs.getParcelable("login");
		teamInfo = mArgs.getParcelable("team");
		mRegularList = mArgs.getParcelableArrayList("regularList");
		mInstance = this;

		rmkLoad(); <<<---- 메인스레드

		initView(v);
		
		new DownloadFilesTask().execute(); <<<-----비동기 스레드

		return v;
	}

	private void URLchange(String clientSn) {

	}

	private class DownloadFilesTask extends AsyncTask<String, Integer, Integer> {

		@Override
		protected void onPreExecute() {
			super.onPreExecute();
		}

		@Override
		protected Integer doInBackground(String... params) {

			AppLog.i(TAG, "GET URL : " + ClientSn);

		
			String fileUrl = ClientSn;  <<<-----  메인스레드 json에서 가져온 URL을 받아서 처리하여야함

			URL myFileUrl = null; // URL 타입의 myFileUrl을 NULL로 초기화 시켜줍니다.

			try {
				myFileUrl = new URL(fileUrl); // 파라미터로 넘어온 Url을 myFileUrl에
				// 대입합니다.

			} catch (MalformedURLException e) // 예외처리를 해줍니다.
			{
				// Todo Auto-generated catch block
				e.printStackTrace();
			}
			try {
				// 실질적인 통신이 이루어지는 부분입니다.
				// myFileUrl 로 접속을 시도합니다.
				HttpURLConnection conn = (HttpURLConnection) myFileUrl
						.openConnection();
				conn.setDoInput(true);
				conn.connect();
				// int length = conn.getContentLength(); // 받아온 컨텐츠의 길이를 length
				// 변수에
				// 저장합니다.
				InputStream is = conn.getInputStream(); // InputStream is 변수에
				// 받아온
				// InputStream을 저장합니다.

				bmImg = BitmapFactory.decodeStream(is); // 받아온 이미지를 bmImg에
				// 넣어둡니다.
				imView.setImageBitmap(bmImg); // imView에 이미지를 셋팅합니다.

			} catch (IOException e) // 예외처리를 해줍니다.
			{
				e.printStackTrace();
			}

			return 0;
		}

	}

	private void rmkLoad() {
		String action = KfsApplication.DEFAULT_URL + "SignatureRmk";
		Map<String, String> params = new HashMap<String, String>();

		params.put("ORD_NO", mRegularInfo.getSeq());
		params.put("ORD_DT", mRegularInfo.getDlvDt());

		mProgressDlg = new ProgressDialog(getActivity());
		mProgressDlg.setMessage("데이터 로딩중...");
		mProgressDlg.setIndeterminate(false);
		mProgressDlg.setCancelable(false);
		mProgressDlg.show();

		action = KfsApplication.addParamsToURL(action, params);
		JsonRequest req = new JsonRequest(action,
				new Response.Listener<JSONObject>() {
					@Override
					public void onResponse(JSONObject response) {
						AppLog.i(TAG, "" + response);
						try {

							ClientSn = response.getString("ClientSn"); <<<--- 메인스레드 json에서 URL 값을 가져오는부분

							AppLog.i(TAG, "SEND URL : " + ClientSn);

							if (!response.isNull("ClientNm")
									&& !response.getString("ClientNm").equals(
											"")) {
								signName.setText(response.getString("ClientNm")
										.replace("<br />", "\n"));
							}

							if (!response.isNull("Rk1")
									&& !response.getString("Rk1").equals("")) {
								remark_tv.setText(response.getString("Rk1")
										.replace("<br />", "\n"));
							}

							if (!response.isNull("Rk2")
									&& !response.getString("Rk2").equals("")) {
								mProgressDlg.dismiss();
								remark.setText(response.getString("Rk2")
										.replace("<br />", "\n"));

							} else {

								mProgressDlg.dismiss();

							}

						} catch (JSONException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}, new Response.ErrorListener() {
					@Override
					public void onErrorResponse(VolleyError error) {
						mProgressDlg.dismiss();
						String msg = error.getMessage();
						new AlertDialog.Builder(getActivity()).setMessage(msg)
								.setCancelable(false).setTitle("오류")
								.setPositiveButton(R.string.ok, null).create()
								.show();
					}
				});

		KfsApplication.getInstance().addToRequestQueue(req);
		
	}

 

필요한 소스부분인데요

네트워크 데이터 처리가 두가지입니다.

하나는 json으로 받아오고, 하나는 Async를 사용해서 처리중인데요.

문제는 json으로 데이터 a를 받아와서 그 a를 갖고 Async에서 처리를 해야하는데요...

 

문제는 Async가 처리되는속도가 더 빨라서 json에서 데이터를 받아오기전에 실행되므로 null 값이 들어갑니다.

로그찍어봐도 역시 순서가 바꼈구요..

 

그래서 json에서 데이터를 받아오고나서 Async스레드를 실행시켜야하는데요

어떻게 해야할까요.. 9시간째 해봤는데 초짜실력으로는 답이 안나와서 처음으로 질문드립니다.

 

대충 어떻게 하는진 알고있지만 손을 어디서부터 대야할지 구체적으로 가르쳐주시면 감사드리겠습니다.,, 

직접적으로 코드를 명시해주시면 정말 감사하겠습니다.. ㅠㅠ 실력자분들 도와주세요

silvec (160 포인트) 님이 2016년 1월 13일 질문

5개의 답변

0 추천

 mProgressDlg.dismiss(); <-- 여기 실행되는부분이 json 으로 값을  불러오고나면 다이얼로그가 사라지는거같은데 여기에다가  

 

  new DownloadFilesTask().execute();
                        out.close();  <-- 한번 넣어서 해보세용

sadeva (21,550 포인트) 님이 2016년 1월 13일 답변
out.close(); 가 밑줄표시로 나와요 ㅠㅠ
아..out.close빼고 한번해보세용.ㄷㄷ
0 추천
수차적으로 작업을 수행 하고 싶으시다면 방법은 많아요~~!

핸들러를 사용 해도 되고 인터페이스를 사용 해도 되고 브로드캐스트리시버를 사용해도 되고

편하신걸로 하나 선택 하셔서 사용 하시면 되겠지요~~!
ThisPlus (46,920 포인트) 님이 2016년 1월 14일 답변
0 추천

json 불러오는 코드와 async는 비동기적으로 처리되기 때문에 순차적으로 진행되지 않습니다. 순차적으로 진행하기 위해서는  json을 받아오는 onResponse 메서드가 끝나는 부분에 new DownloadFilesTask().execute(); 코드를 넣어주시면 됩니다.

마리노 (3,320 포인트) 님이 2016년 1월 14일 답변
0 추천
AsyncTask의 순서는 AsyncTask1 끝나는데서 AsyncTask2 호출 .... 계속 이런식으로

붙여줘야 합니다.
익명사용자 님이 2016년 1월 14일 답변
0 추천

아 모두들 감사합니다

 

OnRespon 이후에  new DownloadFilesTask().execute(); 하는것이 맞는 방법이었네요.

글쓰기 이전에도 시도해 봤던 방법이지만 에러가 나서 안되는 방법인줄 착각했네요

에러가 났던 이유는 doInBackground 안에서 

imView.setImageBitmap(bmImg); // imView에 이미지를 셋팅합니다

이부분을 처리하려고 했기 때문이었네요.

 

이안에서는 UI부분을 수정하면 안되는거였네요.

그래서 BITMAP을 리턴으로 POSTEXECUTE 로 넘기고 거기서 처리하게끔 하니까 됩니다.

 

다들 열정적인 답변 감사드립니다,.

 

 

silvec (160 포인트) 님이 2016년 1월 14일 답변
...