gpt4 book ai didi

java - 异步任务和线程

转载 作者:行者123 更新时间:2023-11-29 20:48:12 26 4
gpt4 key购买 nike

我对使用 AsyncTaskThread 感到很困惑。我知道没有必要在 中创建一个新的 Thread >AsyncTask,但我必须这样做。在 AsyncTask 中,我从服务器获取一些数据并需要从另一台服务器获取照片。所以我创建了 request 到社交网络的数据库并获取它。 request 在新线程中执行。 这里是问题所在: AsyncTask 只执行一半的requests,有时只执行全部。 11 个请求,只执行了其中的 7 个

AcynTask:

  public DB_read_all(Context _context){
context = _context;
}
@Override
protected String doInBackground(String... strings) {
List<NameValuePair> params = new ArrayList<NameValuePair>();

// getting JSON string from URL
JSONObject json = jParser.makeHttpRequest(url_read_all, "GET", params);

// Check your log cat for JSON reponse
if(json!=null){
//Log.e("Users_all: ", json.toString());
try {
// Checking for SUCCESS TAG
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
users = json.getJSONArray(TAG_USERS);
Log.e("Succes getting users, users amount", String.valueOf(users.length()));

for (int i = 0; i < users.length(); i++) {

JSONObject c = users.getJSONObject(i);
id = c.getString(TAG_ID);
first_name = c.getString(TAG_FIRST_NAME);
ListOfFName.add(first_name);

last_name = c.getString(TAG_LAST_NAME);
ListOfLName.add(last_name);

vk_id = c.getString(TAG_VK_ID);
ListOfVkId.add(vk_id);

points= c.getString(TAG_POINTS);
ListOfPoints.add(points);
}
} else {
Log.e("DB_read_all","Db Error!");
}
} catch (JSONException | UnsupportedEncodingException e) {
e.printStackTrace();
}
catch (Exception e){

Logger logger = Logger.getAnonymousLogger();
logger.log(Level.SEVERE, "an exception was thrown while converting", e);
Log.e("DB_read_all","Db Error!");
}
} else{
Log.e("DB_read_all","JSON ERROR");
}

for(int i = 0; i<ListOfFName.size();i++){
setUserPhotoUrl(ListOfFName.get(i), ListOfLName.get(i), ListOfVkId.get(i), ListOfPoints.get(i));
}
return null;
}

新线程中请求的方法:

private void setUserPhotoUrl(final String _first_name,
final String _last_name,final String _vk_id,final String _points){
VKRequest request = VKApi.users().get(VKParameters.from(VKApiConst.USER_ID, _vk_id,
VKApiConst.FIELDS, "photo_100"));

request.executeWithListener(new VKRequest.VKRequestListener() {
@Override
public void onComplete(final VKResponse response) {
super.onComplete(response);
//Log.e("second", String.valueOf(I));
//Log.e("second", String.valueOf(_first_name));
VKList<VKApiUser> User = (VKList<VKApiUser>) response.parsedModel;
if(User.get(0).photo_100!=null)
photo_url = User.get(0).photo_100;

Bitmap photoBm = null;

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = prefs.edit();
if(photo_url !=null){
try {
photoBm = Internet.convertUrlToImage(photo_url);
}
catch (Exception e)
{
Logger logger = Logger.getAnonymousLogger();
logger.log(Level.SEVERE, "an exception was thrown while converting", e);
}
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if(photoBm!= null)
photoBm.compress(Bitmap.CompressFormat.PNG, 100, baos);

byte[] b = baos.toByteArray();
String encodedPhoto = Base64.encodeToString(b, Base64.DEFAULT);

editor.putString("UserFirstName" + String.valueOf(I), _first_name);
editor.putString("UserLastName" + String.valueOf(I), _last_name);
editor.putString("UserVkId" + String.valueOf(I), _vk_id);
editor.putString("UserPoints" + String.valueOf(I), _points);
editor.putString("UserPhoto"+String.valueOf(I),encodedPhoto);
editor.apply();

if(I == users.length() - 1){
Log.e("DB_read_all","Success");
}
Log.e("second",String.valueOf(I));
I++;
}

最佳答案

Thread/Runable 在主 gui 线程之外的单独线程中运行,而 Async 在主线程和工作线程上运行,onPreExecute/onPostExecute 在主线程中运行,而 doInBackground 在单独的线程中运行说工作线程,而对于你的问题,不要在 doInBackground 中创建另一个线程,因为它本身就是线程,所以你为什么要创建另一个线程来加载/发布来自/到另一台服务器的数据,你可以在你的doInBackground中做尽可能多的事情,是的,如果你想执行并行执行使用线程池执行器来启动你的asynctask。是的,你可以用简单的线程来做,但它们在一个单独的线程上运行,所以如果你不使用处理程序等,你就不能直接控制这些线程。我强烈建议您在线程/可运行上使用异步任务

关于java - 异步任务和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29856462/

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