问题描述
我有一个AsyncTask,它显示了来自外部URL的项目列表。
package com.bornander.sandBox;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.NinePatch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.utils.BaseDrawable;
import com.badlogic.gdx.scenes.scene2d.utils.TiledDrawable;
import com.badlogic.gdx.scenes.scene2d.utils.TransformDrawable;
public class BorderedTiledDrawable extends BaseDrawable implements TransformDrawable {
private TiledDrawable region;
private NinePatch patch;
private int left;
private int top;
private int right;
private int bottom;
public BorderedTiledDrawable(Texture background,Texture border,int left,int top,int right,int bottom) {
region = new TiledDrawable(new TextureRegion(background));
this.patch = new NinePatch(border,left,top,right,bottom);
this.left = left - 1;
this.top = top - 1;
this.right = right - 1;
this.bottom = bottom - 1;
setMinWidth(patch.getTotalWidth());
setMinHeight(patch.getTotalHeight());
setTopHeight(patch.getPadTop());
setRightWidth(patch.getpadright());
setBottomHeight(patch.getPadBottom());
setLeftWidth(patch.getPadLeft());
}
@Override
public void draw(Batch batch,float x,float y,float originX,float originY,float width,float height,float scaleX,float scaleY,float rotation) {
region.draw(batch,x,y,originX,originY,width,height,scaleX,scaleY,rotation);
patch.draw(batch,rotation);
}
@Override
public void draw(Batch batch,float height) {
region.draw(batch,x + left,y + top,width - (left + right),height - (top + bottom));
patch.draw(batch,height);
}
}
我正在这样执行它:
private static class GetContacts extends AsyncTask<String,Void,List<Actors>> {
ProgressDialog dialog;
private final WeakReference<Search> activityReference;
GetContacts(Search context) {
activityReference = new WeakReference<>(context);
}
@Override
protected void onPreExecute() {
Search activity = activityReference.get();
if (activity == null || activity.isFinishing() || activity.isDestroyed()) return;
super.onPreExecute();
dialog = new ProgressDialog(activity);
dialog.setMessage(activity.getResources().getString(R.string.Searching));
dialog.setTitle(activity.getResources().getString(R.string.connecting));
dialog.show();
dialog.setCancelable(false);
}
@Override
protected List<Actors> doInBackground(String... sText) {
final Search activity = activityReference.get();
List<Actors> myList = new ArrayList<>();
HttpHandler sh = new HttpHandler();
String url = "http://myurl?par="+sText;
String jsonStr = sh.makeServiceCall(url);
if (jsonStr != null) {
try {JSONObject jsonObj = new JSONObject(jsonStr);
JSONArray actors = jsonObj.getJSONArray("result");
for (int i = 0; i < actors.length(); i++) {
JSONObject c = actors.getJSONObject(i);
Actors actor = new Actors();
actor.setNazov(c.getString("title"));
actor.setPerex(c.getString("perex"));
myList.add(actor);
}
} catch (final JSONException e) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(activity,R.string.Nodata,Toast.LENGTH_LONG).show();
}
}); }
return myList;
} else {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(activity,R.string.Network,Toast.LENGTH_LONG).show();
}
});
return null;
}
}
protected void onPostExecute(List<Actors> result) {
Search activity = activityReference.get();
if (activity == null || activity.isFinishing() || activity.isDestroyed()) return;
super.onPostExecute(result);
if (dialog != null) {
dialog.dismiss(); dialog = null;
}
activity.actorsList.clear();
if (result!=null) { activity.actorsList.addAll(result);}
activity.adapter.notifyDataSetChanged();
}
}
但是仍然可以正常工作,但从Android 11开始不推荐使用AsyncTask。我已经阅读了许多有关某些替换的主题,但仍然没有找到解决方案来替换我的情况。
我尝试过被建议为使用Thread的最简单解决方案,
但是,这并不像预期的那么容易。存在很多问题,例如无法解析方法'runOnUIThread(java.lang.Runnable)',无法解析方法'start()'等。
实际上,我不确定如何替换整个异步任务。
1 /有onPreExecute(),我不确定从那里放东西,因为我需要显示一个加载对话框。
2 /列表doInBackground(String ... sText)-具有参数(String)的后台任务本身
3 /,最后是onPostExecute
能否请您帮忙解释和建议如何重新创建此代码以使其正常工作,而不是不推荐使用的AsyncTask? (在Java中,没有Kotlin,就Kotlin而言,我也找到了一些Coroutinescope解决方案)
我设法做到的是这样:
new GetContacts(Search.this).execute(newText,lng);
但是,我在这里遇到错误java.lang.IllegalStateException:不允许退出主线程,这样就根本无法工作。
并且仍然缺少前后执行的东西。即使我从主线程中删除退出,该列表也不会出现。
解决方法
要从服务器api获取,请使用retrofit2。很简单