gpt4 book ai didi

java - Android AsyncTask 中的 doInBackground

转载 作者:行者123 更新时间:2023-11-29 03:14:05 25 4
gpt4 key购买 nike

我想知道如果一个AsyncTaskdoInBackground方法调用了一个方法,比如XYZ(),那个方法是否也是异步执行?

在这种情况下,我们可以在 XYZ() 中更改 UI 吗?它会使 UI 无响应吗?

我在 doInBackground 中有一个方法调用,它是网络密集型的,需要从 Web 下载图像。一旦调用该方法,UI 就会变得无响应。为什么?

protected String[] doInBackground(String... params)
{

String[] response = new String[2];
Log.v("Background", "I am in background!");

String url = params[0];
String VoiceInput = params[1];
IsCalledOnVoiceInput = VoiceInput;
Log.v(url,url);
HttpPost httppost = new HttpPost(url);
try
{

HttpParams p = new BasicHttpParams();
HttpClient httpclient = new DefaultHttpClient(p);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
responseBody = httpclient.execute(httppost,
responseHandler);
Log.v("Thread", responseBody);

//Getting background image URL
JSONObject reader = new JSONObject(responseBody);
JSONObject coords = reader.getJSONObject("coord");
loc_latitude = coords.getString("lat");
loc_longitude = coords.getString("lon");
String imageURL="";
/////////////////////////////////////////////////////////////////////////////////
try
{
imageURL = getRandomImageURL(loc_latitude,loc_longitude);
Log.v("Image URL as recieved from getRandomImageURL", imageURL);
//Trying to convert Image from the above URL, get it and theh convert it to String
URL urlOfTheImage = new URL(imageURL);

bmp = BitmapFactory.decodeStream(urlOfTheImage.openConnection().getInputStream());
//Image successfully converted to string, ready to pass as a parameter!
response[0] = "";
}
catch(Exception e)
{
Toast.makeText(getApplicationContext(),"There seems to be a problem with the application. Please try again later.", Toast.LENGTH_LONG).show();
}
Log.v("URL of Random Image",imageURL);

}

catch (ClientProtocolException e)
{
e.printStackTrace();
}

catch (IOException e)
{
e.printStackTrace();
}
catch (JSONException e)
{
e.printStackTrace();

}

response[1] = responseBody;
return response;
}

getRandomImageURL 方法和 try block 中的所有代码都是网络密集型的。我也可以提供它的代码。

最佳答案

在后台执行的代码在单独的线程中运行。它所做的任何事情,包括调用其他方法,都发生在该线程中。由于这不是 UI 线程,因此进行 UI 调用是无效的。您必须向 UI 线程发布消息。

关于java - Android AsyncTask 中的 doInBackground,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27660452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com