如何在此处获取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);
}
});
答案 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中。