我对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更改为静态也会导致内存泄漏。将异步任务更改为顶级类对我不利。我在不同的活动中有许多异步任务。
所以有人知道如何解决这个问题吗?