如何将onPostExcecute的结果值赋予onCreate

时间:2017-01-17 06:47:32

标签: android android-asynctask

如何在此处获取AsyncTask的结果值。

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

    @Override
    protected String doInBackground(String... params) {
        HttpURLConnection connection = null;
        BufferedReader reader = null;

        try {
            URL url = new URL(params[0]);
            connection = (HttpURLConnection) url.openConnection();

            connection.connect();

            InputStream stream = connection.getInputStream();

            reader = new BufferedReader(new InputStreamReader(stream));

            StringBuffer buffer = new StringBuffer();

            String line = "";
            while ((line = reader.readLine()) != null) {
                buffer.append(line);
            }

            String finalJSON =buffer.toString();

            JSONObject parentObject = new JSONObject(finalJSON);
            JSONArray parentArray = parentObject.getJSONArray("tbl_user");

            JSONObject finalObject = parentArray.getJSONObject(0);


            String firstname = finalObject.getString("userImage");

            return firstname;

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return null;
    }


    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        try {
            com.nostra13.universalimageloader.core.ImageLoader.getInstance().displayImage(result, ivUser);
            Log.d(TAG, result);
        }catch (IllegalArgumentException e){
            Log.d(TAG,e.toString());
        }
    }
}

我在onStart这样调用它。所以我可以加载。当它加载时我想得到图像的字符串。

@Override
protected void onStart() {
    super.onStart();

    new JSONPicture().execute("http://carkila.esy.es/carkila/profile/profileImage.php?username="+pref.getString("username","").toString());

}

当我点击这样的图片时,我想获取图片的网址。

        ivUser.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d(TAG, ivUser.toString);


        }
    });

2 个答案:

答案 0 :(得分:3)

你不是。 AsyncTask的目的是并行运行。如果您要等待结果,则没有理由使用AsyncTask。通过强制UI线程等待,您将使应用程序无法响应用户。如果执行时间过长,则会导致应用程序因监视程序计时器而崩溃。

正确的做法是将所有需要结果的逻辑放在onPostExecute中。如果需要,可以设置加载栏或其他UI元素,以显示应用程序正在等待,直到您获得结果。

答案 1 :(得分:0)

您可以使用更加机械化的方式将值存储在缓存存储中,您可以从应用中的任何位置进行检索。我推荐tinyDB。

gradle`comped'com.mukesh:tinydb:1.0.1'

TinyDB tinyDB = new TinyDB(getApplicationContext());

tinyDB.putString("key",value);

然后您可以使用以下代码行从应用程序中的任何位置检索值。

tinyDB.getString("key");

机械但高效。只需先调用onCreate中的异步任务方法,然后调用tinyDB.getString。将字符串存储在onPostExecute的tinyDB中。