chu*_*ann 3 android memory-leaks static-class android-handler
我是android的新手,我尝试开发一个系统但是当我完成代码时,处理程序会显示此警告
下面显示我编辑后的代码,事件ontounch中的处理程序显示警告处理程序无法解析.我尝试将//忽略处理程序,我尝试运行应用程序并将其结果强制关闭.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Rag*_*dan 10
使您的处理程序成为静态类.
警告是一个棉绒警告.您可以禁用警告,但它是一个有用的信息
这是一个Lint Check列表
http://tools.android.com/tips/lint-checks
引自来源@
http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html
如果不控制生命周期,请避免活动中的非静态内部类,使用静态内部类并对内部活动进行弱引用.
这个问题的解决方案是使用带有WeakReference外部类的静态内部类,例如,在ViewRoot其内部类中使用它.
另请查看android开发者小组的讨论.检查Romain Guy的解决方案
https://groups.google.com/forum/#!topic/android-developers/1aPZXZG6kWk
来自上述链接的Romain Guy解决方案的示例
class OuterClass {
class InnerClass {
private final WeakReference<OuterClass> mTarget;
InnerClass(OuterClass target) {
mTarget = new WeakReference<OuterClass>(target);
}
void doSomething() {
OuterClass target = mTarget.get();
if (target != null) target.do();
}
Run Code Online (Sandbox Code Playgroud)
编辑:
例:
public class MainActivity extends Activity {
LinearLayout ll;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ll = new LinearLayout(this);
new HandlerClass(this);
}
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 (target != null)
if(msg.what==1){
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);
}
};
}
Run Code Online (Sandbox Code Playgroud)
如果上述错误或有问题,请纠正我.
您还可以通过Alex Lockwood查看此博客
http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html
| 归档时间: |
|
| 查看次数: |
9378 次 |
| 最近记录: |