如何从AsyncTask共享值

时间:2015-02-03 12:31:41

标签: java android json

我试图根据我从url的Json数据获得的Rgb值绘制渐变

我从AsyncTask获取数据,然后尝试使用该rgb

进行绘制

我只是制作一个全局变量来实现它

帮助!

package kr.co.company.gradienttest;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader.TileMode;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

class MyView extends View {
    String feeling = "a";
    int rgb_r = 0;
    int rgb_g = 0;
    int rgb_b = 0;

    int[] colors = { Color.WHITE, Color.BLUE, Color.RED };

    public String getJsonText() {

        // 내부적으로 문자열 편집이 가능한 StringBuffer 생성자
        String line2 = null;

        try {
            String simpleUrl = "http://www.ibtk.kr/ehcdCbEColor/9141c5bbd85536b91342504e6e23c049?model_query_pageable.pageSize=200&model_query_fields=%7B%27cbaAlikeWord%27:1,%27cbaR1%27:1,%27cbaG1%27:1,%27cbaB1%27:1,%27_id%27:0%7D";

            String line = getStringFromUrl(simpleUrl);
            line2 = line;

            // 원격에서 읽어온 데이터로 JSON 객체 생성
        } catch (Exception e) {
            e.printStackTrace();
        }
        return line2;
    } // getJsonText

    // getStringFromUrl : 주어진 URL 페이지를 문자열로 얻는다.
    public String getStringFromUrl(String url)
            throws UnsupportedEncodingException {

        // 입력스트림을 "UTF-8" 를 사용해서 읽은 후, 라인 단위로 데이터를 읽을 수 있는 BufferedReader 를
        // 생성한다.
        BufferedReader br = new BufferedReader(new InputStreamReader(
                getInputStreamFromUrl(url), "UTF-8"));

        // 읽은 데이터를 저장한 StringBuffer 를 생성한다.
        StringBuffer sb = new StringBuffer();

        try {
            // 라인 단위로 읽은 데이터를 임시 저장한 문자열 변수 line
            String line = null;

            // 라인 단위로 데이터를 읽어서 StringBuffer 에 저장한다.
            while ((line = br.readLine()) != null) {
                sb.append(line);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sb.toString();
    } // getStringFromUrl

    // getInputStreamFromUrl : 주어진 URL 에 대한 입력 스트림(InputStream)을 얻는다.

    public static InputStream getInputStreamFromUrl(String url) {
        InputStream contentStream = null;
        try {
            // HttpClient 를 사용해서 주어진 URL에 대한 입력 스트림을 얻는다.
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = httpclient.execute(new HttpGet(url));
            contentStream = response.getEntity().getContent();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return contentStream;
    } // getInputStreamFromUrl

    private class JsonLoadingTask extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... strs) {

            return getJsonText();
        } // doInBackground : 백그라운드 작업을 진행한다.

        @Override
        protected void onPostExecute(String result) {
            try {
                JSONObject object = new JSONObject(result);

                // "kkt_list" 배열로 구성 되어있으므로 JSON 배열생성
                JSONArray Array = new JSONArray(object.getString("content"));

                // for (int i = 0; i < Array.length(); i++) {
                // bodylist 배열안에 내부 JSON 이므로 JSON 내부 객체 생성
                JSONObject insideObject = Array.getJSONObject(1);

                // StringBuffer 메소드 ( append : StringBuffer 인스턴스에 뒤에 덧붙인다. )
                // JSONObject 메소드 ( get.String(), getInt(), getBoolean() .. 등 :
                // 객체로부터 데이터의 타입에 따라 원하는 데이터를 읽는다. )

                // "느낌
                feeling = insideObject.getString("cbaAlikeWord");

                Log.d("feeling인 jsonget", feeling);
                rgb_r = insideObject.getInt("cbaR1");
                rgb_g = insideObject.getInt("cbaG1");
                rgb_b = insideObject.getInt("cbaB1");

                colors[0] = Color.BLUE;
                colors[1] = Color.RED;
                colors[2] = Color.WHITE;

                // } // for
            } catch (JSONException e) {
                e.printStackTrace();

            }

        } // onPostExecute : 백그라운드 작업이 끝난 후 UI 작업을 진행한다.
    } // JsonLoadingTask

    public MyView(Context context) {

        super(context);
        setBackgroundColor(Color.BLACK);

    }

    public void onDraw(Canvas canvas) {

        Paint paint = new Paint();

        paint.setShader(new LinearGradient(0, 0, 320, 0, colors, null,
                TileMode.CLAMP));
        canvas.drawRect(0, 210, 300, 260, paint);
        canvas.drawText("colors[]", 0, 280, paint);

    }
}

public class GradientTest extends Activity {
    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyView(this));

    }
}

1 个答案:

答案 0 :(得分:0)

声明AsyncTask的最后一种类型,在你的情况下是String,你在doInBackground方法中返回一个JSON字符串,你可以用它来返回Integer数组,你可以在0,第1和第2位设置r,g和b数组的索引并返回该数组而不是JSON字符串(在doInBackGround方法中将json解析为r,g和b)。

  private class JsonLoadingTask extends AsyncTask<String, Void, int [] >

并且您的doInBackground方法将数组返回为

 protected int[] doInBackground(String... strs) {

            String jsonString =  getJsonText();
            JSONObject object = new JSONObject(result);
            JSONArray Array = new JSONArray(object.getString("content"));
            JSONObject insideObject = Array.getJSONObject(1);
            feeling = insideObject.getString("cbaAlikeWord");
            int [] rgbArrayTemp = new int [3];
            Log.d("feeling jsonget", feeling);
            rgbArrayTemp[0] = insideObject.getInt("cbaR1");
            rgbArrayTemp[1] = insideObject.getInt("cbaG1");
            rgbArrayTemp[2] = insideObject.getInt("cbaB1");

            colors[0] = Color.BLUE;
            colors[1] = Color.RED;
            colors[2] = Color.WHITE;
            return rgbArrayTemp;

    } // doInBackground 

这样你就可以打电话了

int [] rgbArray = new JsonLoadingTask("").execute().get();

rgbArray将包含颜色值。