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

AsyncTask 의 결과값으로 화면 갱신 URL클래스 생성 [closed]

0 추천

AsyncTask 의 결과값으로 String 을 가져와

TextView에서 보여주고 싶습니다

AsyncTask는 해당 액티비티내 클래스가 아닌 별도의 패키지로 작성돼 있기 때문에 AsyncTask내에서 직접

TextView를 조작하지는 못합니다. 

메소드와 url주소를 인자로 받아 해당 주소에서 GET해온 결과를 그대로 String으로 반환하면

결과값을 이용해 TV.setText();해서 바꿔주려고 하는데 항상 null값을 반환합니다.

(디버그모드에서 관찰하면 getclient에서 첫줄

URL url =new URL(apiserver+params[1]);

실행후 다음라인이 아닌 맨 마지막 라인 return result; 문을 실행해버립니다)

의도한대로 동작하려면 어떻게 해야할까요?

 

project.apitestactivity의 apiclltest.java

bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String txt = et.getText().toString();
                APIcall at = new APIcall();
                try {
                    String result = at.execute("GET",txt).get();
                    if(result!=null){tv.setText(result);}
                    else{tv.setText("null");}
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
        });

 

 

project.httpclient의 APIcall.java

package com.example.hp.plugapptest.httpclient;

import android.os.AsyncTask;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * Created by hp on 2017-06-01.
 */

public class APIcall extends AsyncTask<String, Void, String> {
    String result = null;
    String apiserver = "address/apiserver";

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

    @Override
    protected String doInBackground(String... params) {
        //publishProgress();
        String result=null;
        switch(params[0]){
            case "GET" :
                result = getClient(params);
                break;
            case "POST" :
                break;
        }
        return result;
    }

    @Override
    protected void onPostExecute(String aVoid){
        super.onPostExecute(aVoid);
    }

    protected String getClient(String... params){
        try {
            URL url =new URL(apiserver+params[1]);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();

            conn.setReadTimeout(1000);
            conn.setConnectTimeout(15000);
            conn.setRequestMethod(params[0]);
            conn.setDoInput(true);
            //conn.setDoOutput(true);
            conn.setUseCaches(false);
            conn.setDefaultUseCaches(false);

            String cookie  = conn.getHeaderField("Set-Cookie");

            InputStream is = conn.getInputStream();

            StringBuilder builder = new StringBuilder();
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
            String line;

            conn.disconnect();

            while((line = reader.readLine())!=null) {
                builder.append(line + "\n");
            }
            result = builder.toString();
        }catch (IOException io){
            io.printStackTrace();
        }
        return result;
    }

    protected void postClient(String... params){
        try {
            URL url =new URL(apiserver+params[1]);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();

            conn.setRequestMethod(params[0]);
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setReadTimeout(1000);
            conn.setConnectTimeout(15000);

            OutputStream os = conn.getOutputStream();

            StringBuilder builder = new StringBuilder();
            String line;
        }catch (IOException io){
            io.printStackTrace();
        }
    }
}//end of AsyncTask class

 

질문을 종료한 이유: 스스로 해결
신입 (570 포인트) 님이 2017년 6월 1일 질문
신입님이 2017년 6월 1일 closed
...