内部类AsyncTask是静态的还是通过WeakReference实现的?

我对android中这种简单频繁发生的情况有疑问。

我有一个活动,该活动将调用async任务,并且async任务将从SQLite数据库中提取值并在UI上进行更新。我使用Async任务使UI响应迅速。

这是我一直在努力的代码。

SqlHandler sqlHandler;
@BindView(R.id.list) ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity1);

    ButterKnife.bind(this);

    sqlHandler = new SqlHandler(this);

    new DisplayAll(this).execute();

    listView.setOnItemClicklistener((AdapterView<?> parent,View view,int position,long id) -> {
                Intent i = new Intent(getapplicationContext(),activity2.class);
                String text = textView.getText().toString();
                startactivity(i);
    });
}

private class DisplayAll extends AsyncTask<Void,Void,Void> {

    int null_val;

    final ArrayList<listRow=> myList = new ArrayList<>();

    private WeakReference<activity> mactivity;

    public DisplayAll(activity activity) {
        mactivity = new WeakReference<>(activity);
    }


    @Override
    protected Void doInBackground(Void... params) {

        myList.clear();
        String query = " ...";

        Cursor c1 =sqlHandler.selectQuery(query);
        if (c1 != null && c1.getcount() != 0) {
            if (c1.moveToFirst()) {
                do {
                     .....

                } while (c1.moveToNext());
            }
        }

        try {
            null_val = Objects.requireNonNull(c1).getcount();
            c1.close();
        }
        catch (NullPointerException e)
        {
            Log.e("NPE","" + e);
         }
        return null;
    }
    @Override
    protected void onPostExecute(Void param) {

        // get a reference to the activity if it is still there
        activity activity = mactivity.get();
        if (activity == null || activity.isFinishing()) return;

        ProgressBar prgBar=findViewById(R.id.prgbar);
        listAdapter Adapter;

        prgBar.setVisibility(View.GONE);
        Adapter = new listAdapter(getapplicationContext(),myList);
        listView.setadapter(Adapter);

    }
}

我也检查了this个问题。现在我给班级添加了弱引用。但是Android Studio仍然会警告我有关内存泄漏的信息。

我试图将其更改为静态,但是将sqlhandler更改为静态也会导致内存泄漏。将异步任务更改为顶级类对我不利。我在不同的活动中有许多异步任务。

所以有人知道如何解决这个问题吗?

fxangin 回答:内部类AsyncTask是静态的还是通过WeakReference实现的?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2821089.html

大家都在问