我是一名Java开发人员已有2年.
但我从来没有在我的代码中写过WeakReference.如何使用WeakReference使我的应用程序更高效,尤其是Android应用程序?
这个问题发布在某个网站上.我没有在那里找到正确的答案,所以我再次在这里发布.
public class TestThread {
public static void main(String[] s) {
// anonymous class extends Thread
Thread t = new Thread() {
public void run() {
// infinite loop
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
// as long as this line printed out, you know it is alive.
System.out.println("thread is running...");
}
}
};
t.start(); // Line A
t = null; // Line B
// no more references for Thread t
// another infinite …Run Code Online (Sandbox Code Playgroud) Android示例中的"Login"实现AsyncTask为非静态内部类.然而,根据Commonsguys,这个类应该是静态的,并使用弱参考外部活动看到这个.
那么实施的正确方法是AsyncTask什么?静态还是非静态?
Commonsguy Implementation
https://github.com/commonsguy/cw-android/tree/master/Rotation/RotationAsync/
从Google登录示例
package com.example.asynctaskdemo;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.TargetApi;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.TextView;
/**
* Activity which displays a login screen to the user, offering registration as
* well.
*/
public class LoginActivity extends Activity {
/**
* A dummy authentication store containing known user names and passwords.
* TODO: remove …Run Code Online (Sandbox Code Playgroud) Inner static Class如果它存在,我可以在Kotlin语言中使用什么替代品?如果没有,当我需要static class在Kotlin中使用时,如何解决这个问题?请参阅以下代码示例:
inner class GeoTask : AsyncTask<Util, Util, Unit>() {
override fun doInBackground(vararg p0: Util?) {
LocationUtil(this@DisplayMembers).startLocationUpdates()
}
}
Run Code Online (Sandbox Code Playgroud)
我搜索了很多,没找到任何东西,非常感谢你提前.
这里有很多关于This class should be static or leaks might occurjava android的问题.
此Handler类应该是静态的,否则可能会发生泄漏:IncomingHandler
此Handler类应该是静态的,否则可能会发生泄漏:AsyncQueryHandler
这个AsyncTask类应该是静态的,否则可能会发生泄漏(匿名android.os.AsyncTask)
警告是由于内部类保存了对外部类的隐式引用,因此阻止了外部类的GC'd.解决方案在于警告本身应该将类声明为静态.
但是,该解决方案是特定于Java的.鉴于kotlin没有static修饰符,最接近的是伴随对象,伴随对象确实引用了它的"外部类".
以下是我的[失败]尝试的评论
class MyActivity : AppCompatActivity(), MyListener {
companion object {
class Attempt3Task(val callback: MyListener) : AsyncTask<Unit, Unit, Unit>() {
override fun doInBackground(vararg params: Unit?) {
TODO("")
}
override fun onPostExecute(result: Unit?) {
callback.updateUi()
}
}
}
inner class Attempt2Task : AsyncTask<Unit, Unit, Unit> () {
override fun doInBackground(vararg params: Unit?) {
TODO("
}
}
// Gives warning "This AsyncTask …Run Code Online (Sandbox Code Playgroud) 在android中,我试图防止内存泄漏。我继承了一些遗留代码,开发人员在其中创建了一个 asyncTask 作为匿名内部类,如下所示:
void startAsyncTask() {
new AsyncTask<Void, Void, Void>() {
@Override protected Void doInBackground(Void... params) {
while(true);//loop to keep thread alive forever.
}
}.execute();
}
Run Code Online (Sandbox Code Playgroud)
所以我在这个例子中使用了一个循环只是为了让子线程永远活着,这样我就可以演示我的观点。所以从活动中如果我打电话startAsyncTask()会不会有内存泄漏?该类没有活动引用,但我意识到匿名类实际上是一个非静态内部类,因此拥有对外部类的引用。那么这本身就是内存泄漏是真的吗?
我试图在我的android项目中实现Cursor Loader和Custom Cursor Adapter数据库(Sqlite本地数据库).我实际上想借助Cursor Loader和Adapter`将我的listview与本地数据库中的数据异步提供.下面是我的类,子类和方法
// Home Activity class
public class HomeActivity extends FragmentActivity implements LoaderCallbacks<Cursor> {
DotCursorAdapter mAdapter;
private ListView lv;
private final int LOADER_ID = 1932;
DatabaseHandler dbHelper = new DatabaseHandler(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.home_activity);
lv = (ListView) findViewById(R.id.lists);
mAdapter = new DotCursorAdapter(this, null,0);
lv.setAdapter(mAdapter);
getSupportLoaderManager().initLoader(LOADER_ID, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
return new DumbLoader(this);
}
@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
mAdapter.swapCursor(cursor); …Run Code Online (Sandbox Code Playgroud) 曾经使用Android Studio的任何人都知道它有一个非常有用的代码linting容量,可以帮助程序员避免常见的反模式和错误.
然而,这样的系统有时令人烦恼,在这种特殊情况下,我认为它就是这样.
我有一个AsyncTask像下面这样的人
class MyAsyncTask extends AsyncTask<Void, Void, MyDataType> {
private Context context;
MyAsyncTask(Context _context) {
context = _context;
}
@Override
protected void onPreExecute() {
// Show a progress dialog or something
// to indicate that we're doing some work
// here.
}
@Override
protected MyDataType doInBackground(Void... args) {
return generateData(); // returns `MyDataType` of course
}
@Override
protected void onPostExecute(MyDataType data) {
// Deliver the data and then
context = null;
}
}
Run Code Online (Sandbox Code Playgroud)
当然,Android Studio正在告诉我该context …
android ×6
java ×6
kotlin ×2
memory-leaks ×2
android-lint ×1
asynchronous ×1
class ×1
loader ×1
static ×1