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