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

다른곳으로 부터 데이터 받아오는데 오류를 이해 못하겟습니다

0 추천
public class test extends AppCompatActivity {
    String chapter;

    String pnum=null;        //문제 번호
    String baseimg=null;     //문제 이미지
    String answer=null;      //문제 정답

    String[] arraytext;
    Object xx;
    TextView tv;
    ImageView img;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test);
        tv = (TextView) findViewById(R.id.textView);
        img = (ImageView) findViewById(R.id.imageView);
        // Intent intent = getIntent();
        // chapter = (String)intent.getSerializableExtra("chapter");
        getproblem task = new getproblem();
        task.execute();

        try {
            String tt = xx.toString();
            arraytext = tt.split(";");

            answer = getStr(arraytext[0]);
            baseimg = getStr(arraytext[1]);
            pnum = getStr(arraytext[2]);
            byte[] imgte = Base64.decode(baseimg);
            Bitmap putimg = byteArrayToBitmap(imgte);

            img.setImageBitmap(putimg);
        } catch (Exception e)
        {
            tv.setText(e.getStackTrace().toString());
        }
    }

    public Bitmap byteArrayToBitmap(byte[] $byteArray ) {
        Bitmap bitmap = BitmapFactory.decodeByteArray( $byteArray, 0, $byteArray.length ) ;
        return bitmap ;
    }

    public String getStr(String x)          //문자 값 추출
    {
        int index=x.indexOf("=");
        int indexend=x.length();
        String answer=x.substring(index+1,indexend);
        return answer;
    }

    public void GoNext(View v)
    {

    }

    public class getproblem extends AsyncTask<String,String,String> {

        @Override
        protected String doInBackground(String...params)
        {
            SoapObject request = new SoapObject("http://tempuri.org/","DownloadImg");     // 네임스페이스 메소드 이름
            request.addProperty("unit",1);


            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.setOutputSoapObject(request);
            envelope.dotNet=true;
            HttpTransportSE androidHttpTransport=new HttpTransportSE("http://192.168.33.49:11000/Service");     //url

            try {
                androidHttpTransport.call("http://tempuri.org/IService/DownloadImg",envelope);                        //soap의 액션
                Object result=envelope.getResponse();
                xx=result;
                String w=xx.toString();
                return xx.toString();
            }
            catch (Exception e)
            {
                e.printStackTrace();
                return e.toString();
            }

        }
        protected void onPostExecute(String result)
        {
            super.onPostExecute(result);
           tv.setText(result);
        }

    }

이것은 제가 쓴 코드입니다 

catch문으로 잡히고요 

해당문을 받아오는데 왜 null이 문제가 되는지 이해가 안갑니다 

이건 stacktrace 항목 텍스트입니다 

 

익명사용자 님이 2016년 7월 24일 질문

1개의 답변

0 추천

비동기 명령을 실행 시키고 같은 스코프안에서 xx를 참조하셨네요.

onCreate 함수 스코프 내에서 비동기 명령을 실행 시키면서 xx를 참조했습니다.

순서로 보자면

1.getProblem

2.xx참조

3.onCreate 함수 스코프를 벗어나면서(return) getProblem 비동기 작업 시작.

4.비동기 작업에서 xx 설정됨.

------------

 

함수가 리턴되고 비동기 작업이 완료될 때 까지는 xx가 null입니다.

try문 첫줄에 보면 

String tt = xx.toString();

있는데 xx의 toString()을 호출하니 nullPointer가 뜨겠죠?

GetProblem 태스크의 onPostExecute에서 xx에 접근하는 작업을 처리하세요.

칠리님 (10,910 포인트) 님이 2016년 7월 25일 답변
...