Diese Handler-Klasse soll statisch sein oder Undichtigkeiten auftreten (com.test."test3".ui.MainActivity.1)
Ich bin neu auf android und ich versuche ein system zu entwickeln, aber wenn ich fertig bin code die handler zeigen diese Warnung
unten zeigen den code, nachdem ich Bearbeiten, den handler in der event-ontounch zeigen Sie das Warnung-handler nicht behoben werden kann. Ich versuchen Sie, //zu ignorieren, die handler versuche ich die Anwendung ausführen, und das Ergebnis in Kraft in der Nähe.
public class MainActivity extends Activity {
protected static final int STOP = 100;
ImageView iv;
private ProgressBar pb;
LinearLayout ll;
private AnimationDrawable anim;
ScrollView sv;
private SQLiteDatabase db;
private boolean flagscanning = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ll = new LinearLayout(this);
new HandlerClass(this);
db = SQLiteDatabase.openDatabase(Environment.getExternalStorageDirectory()+"/antivirus.sqlite", null, SQLiteDatabase.OPEN_READONLY);
iv = (ImageView) this.findViewById(R.id.imageView1);
//扫描病毒进度条
pb = (ProgressBar) this.findViewById(R.id.progressBar1);
ll = (LinearLayout) this.findViewById(R.id.ll);
//设置ImageView背景资源为动画文件
iv.setBackgroundResource(R.drawable.bg);
//sv用来显示病毒的扫描结果
sv = (ScrollView) this.findViewById(R.id.scrollView1);
anim = (AnimationDrawable) iv.getBackground();
}
private static class HandlerClass extends Handler{
private final WeakReference<MainActivity> mTarget;
public HandlerClass(MainActivity context){
mTarget = new WeakReference<MainActivity>((MainActivity) context);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
MainActivity target = mTarget.get();
if(msg.what==STOP){
target.ll.removeAllViews();
//anim.stop();
}
String str = (String) msg.obj;
TextView tv = new TextView(target);
tv.setText(str);
target.ll.setOrientation(LinearLayout.VERTICAL);
target.ll.addView(tv);
//sv.scrollBy(0, 20);
System.out.println(str);
}
};
@Override
public boolean onTouchEvent(MotionEvent event) {
//如果程序正在杀毒过程中,拒绝再次启动杀毒线程
if(flagscanning){
return false;
}
//如果用户触摸屏幕,则开启杀毒线程
if (event.getAction() == MotionEvent.ACTION_UP) {
flagscanning= true;
anim.start();
new Thread() {
public void run() {
//获取每一个应用程序的签名,签名须与数据库的签名想比较
List<PackageInfo> infos = getPackageManager()
.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_SIGNATURES);
//设置进度条的扫描范围
pb.setMax(infos.size());
int total = 0;
int virustotal = 0;//设置初始病毒数为0
for (PackageInfo info : infos) {
total++;
try {
sleep(20);//只为便于观察扫描效果和进度,无实质作用
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg = Message.obtain();
msg.obj = "正在扫描" + info.packageName;
_handler.sendMessage(msg);_
Signature[] signs = info.signatures;
String str = signs[0].toCharsString();
String md5 = MD5Encoder.encode(str);
//将应用程序签名与数据库中保存的签名进行比较,如果相一致,则使病毒数加1,并通过handler在界面显示病毒包名
Cursor cursor = db.rawQuery("select desc from datable where md5=?",new String[] { md5 });
if (cursor.moveToFirst()) {
String desc = cursor.getString(0);
msg = Message.obtain();
msg.obj = info.packageName + ": " + desc;
_handler.sendMessage(msg);_
virustotal++;
}
cursor.close();
pb.setProgress(total);
}
Message msg = Message.obtain();
msg.what = STOP;
msg.obj = "扫描完毕 ,共发现" + virustotal + "个病毒";
_handler.sendMessage(msg);_
flagscanning = false;
pb.setProgress(0);
};
}.start();
}
return super.onTouchEvent(event);
}
@Override
protected void onDestroy() {
if (db.isOpen())
db.close();
super.onDestroy();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
- machen Sie Ihre handler-Klasse statisch. stackoverflow.com/questions/3106912/...
- Erklären
HanderClass hc
als in der Klasse. dann in der onCreate ersetzennew HandlerClass(this);
durchhc = new HandlerClass(this);
. Und statthandler.sendMessage
verwendenhc.sendMessage
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Machen Sie Ihren handler eine statische Klasse.
Die Warnung ist ein lint-Warnung. Sie können deaktivieren Sie die Warnung, aber eine nützliche info
Hier ist eine Liste von Lint Check
http://tools.android.com/tips/lint-checks
Zitat aus der Quelle @
http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html
Vermeiden, nicht-statische innere Klassen in einer Aktivität, wenn Sie keine Kontrolle über Ihr Leben Zyklus, verwenden Sie eine statische innere Klasse und machen einen schwachen Verweis auf die Aktivität im inneren.
Die Lösung für dieses Problem ist die Verwendung einer statischen inneren Klasse mit einem
WeakReference
an der äußeren Klasse, wie imViewRoot
und seine W innere Klasse für die Instanz.Überprüfen Sie auch diese Diskussion auf android-Entwickler-Gruppe. Überprüfen Sie die Lösung von Romain Guy
https://groups.google.com/forum/#!Thema/android-Entwickler/1aPZXZG6kWk
Beispiel von Romain Guy ' s Lösung aus dem obigen link
Edit:
Beispiel:
Korrigieren Sie mich, wenn das oben falsch ist oder einige Probleme hat.
Können Sie auch überprüfen, in diesem blog von Alex Lockwood
http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html
HanderClass hc
als in der Klasse. dann inonCreate
ersetzennew HandlerClass(this);
durchhc = new HandlerClass(this);
. Und statthandler.sendMessage
verwendenhc.sendMessage
.Beim definieren einer anonyme innere Klasse wie die Klasse selbst ist neu definiert jede Instanz von
MainActivity
. Offenbar ist die Android-SDK-flags, wie die das potential hat, zu lecken, diese Klassen-Definitionen. Die einfachste Lösung ist es, eine statische innere Klasse, nimmt einen Verweis aufMainActivity
im Konstruktor:public class MainActivity extends Activity { private Handler handler = new Handler() { private static final class MainHandler extends Handler { private final MainActivity caller; private MainHandler(final MainActivity caller) { this.caller = caller; } @Override public void handleMessage(Message msg) { } ll.setOrientation(LinearLayout.VERTICAL); } } };
howcome ich cnat Kommentar code-Zeile, wie Tom G hab ich sogar schon ` code `