带有AsyncTask替代品的Android简单列表

问题描述

我有一个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。很简单