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

asynctask안에 asynctask를 쓰는데 두번째 doInBackground안에 안들어가집니다..

0 추천

 

초보라 하드 코딩밖에 할 줄 몰라서 막 갖다 쓰고 있습니다... 그런데 첫번째 AsyncTask는 들어가는데 두번 째 AsyncTask에 못 들어가고 있습니다.

 

정확하게는 doInBackground에 못들어가는거 같습니다.

 

그렇게 판단하는 이유는 생성자를 하나 만들어 두었는데 거기서 Toast를 출력하면 나오는데 그 이후에 (doin부터)는 Toast를 넣어도 출력이 되지않습니다. 

 

실행이 안되는건 아닙니다. 앱이 실행은 되는데 두번째 doin에서 그냥 처리가 더 이루어지지 않는 것 같습니다....

Select_Ven_Info AsyncTask에서 오류가 생기는듯합니다...

 

public class SelectActivity extends AppCompatActivity {
    TextView select_ShopID, select_ShopTel;

    ImageView shop_img[] = new ImageView[6];


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

        select_ShopID = (TextView)findViewById(R.id.select_ShopID);
        select_ShopTel = (TextView)findViewById(R.id.select_ShopTel);

        //코드가 길어 생략


        new SearchTask().execute();


    }

    private class SearchTask extends AsyncTask<Void, Void, String>{
        Intent clickintent = getIntent();
        String clickShopID = clickintent.getStringExtra("clickList").toString();

        String targetURL;


        @Override
        protected void onPreExecute() {
            targetURL = "http://localhost/kiSelect.php?shopID="+clickShopID;
        }

        @Override
        protected String doInBackground(Void... voids) {
            try {
                URL url = new URL(targetURL);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String temp;
                StringBuilder stringBuilder = new StringBuilder();

                while ((temp = bufferedReader.readLine()) != null) {
                    stringBuilder.append(temp + "\n");
                }
                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();

                return stringBuilder.toString().trim();

            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }//end doinBackground

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onPostExecute(String resulut) {
            try{
                JSONObject jsonObject = new JSONObject(resulut);
                JSONArray jsonArray = jsonObject.getJSONArray("response");

                ArrayList<String> list = new ArrayList<String>();
                String s_select_ShopID, s_select_ShopTel;

                for(int i=0; i<jsonArray.length(); i++){
                    JSONObject object = jsonArray.getJSONObject(i);
                    s_select_ShopID = object.getString("shopID");
                    s_select_ShopTel = object.getString("shopTel");

                    select_ShopID.setText(s_select_ShopID);
                    select_ShopTel.setText(s_select_ShopTel);
                }


            }
            catch (Exception e){
                e.printStackTrace();
            }
            new Select_Ven_Info(select_ShopID.getText().toString()).execute();

            //Toast.makeText(SelectActivity.this, "okok~"+select_ShopID.getText().toString(), Toast.LENGTH_LONG).show();
        }

    }//end SearchTask()




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

        String name;
        String selectURL = "http://localhost/kiSelect_info.php?ven_corname="+name;

        public Select_Ven_Info(String name){
            this.name = name;
        }

        @Override
        protected String doInBackground(Void... voids) {

            try {
                Toast.makeText(SelectActivity.this, "good~"+name, Toast.LENGTH_LONG).show();

                URL url = new URL(selectURL);
                HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String temp;
                StringBuilder stringBuilder = new StringBuilder();

                while ((temp = bufferedReader.readLine()) != null) {
                    stringBuilder.append(temp + "\n");
                }
                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();

                return stringBuilder.toString().trim();

            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String resulut) {
            String title_image, product_data1, product_data2, product_data3, product_data4
                    , product_data5, product_data6, index;

            try{
                // 코드가 길어 생략.
                
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
    }
}

 

 

Mustone (350 포인트) 님이 2017년 8월 24일 질문

1개의 답변

0 추천
 
채택된 답변

https://stackoverflow.com/questions/13790351/how-to-show-toast-in-asynctask-in-doinbackground

runOnUiThread(new Runnable() {

public void run() {

  Toast.makeText(getApplicationContext(), "Example for Toast", Toast.LENGTH_SHORT).show();

   }
});

익명사용자 님이 2017년 8월 25일 답변
Mustone님이 2017년 8월 27일 채택됨
제가 알기론 메인스레드 외의 다른 스레드, 즉 doinbackground에서  toast등으로 ui 간섭할 경우 오류가 발생하는걸로 알고있어요.
저도 doinbackground에서 꼭 ui를 변경시켜야 하는 작업이 있어서 이분처럼 runOnUiThread를 사용했습니다. doinbackground들어가자마자 toast를 실행하고 오류가 발생해서 그런거같네요.
...