本人想在MainActivity就做大量的复制、粘贴文件操作,但一旦一执行,整个界面都挂了完全没反应了,求帮助,谢谢。
附源码如下:
主类:birthday1001.test.MainActivitypackage birthday1001.test;import java.util.List;
import java.util.Vector;import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.Window;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;public class MainActivity extends Activity {
private boolean toggleIndeterminate = true;
private Vector<AppItem> vecItems;
private List<ApplicationInfo> listApps;
private LinearLayout layoutInstalledApps;
private Handler handler; public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
// 强制设置为竖屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setContentView(R.layout.layout_main);
// 设置标题栏转圈
setProgressBarIndeterminateVisibility(toggleIndeterminate);
layoutInstalledApps = (LinearLayout) findViewById(R.id.layout_installed_apps);
initInstalledApps();
initHandler();
} private void initHandler() {
handler = new Handler() {
public void handleMessage(Message msg) { }
};
// 执行此句后:界面死了
handler.postDelayed(new Runnable() {
public void run() {
Toast toast = Toast.makeText(MainActivity.this, "running",
Toast.LENGTH_SHORT);
toast.show();
int size = vecItems.size();
for (int i = 0; i < size; i++) {
scanAppItem(vecItems.get(i));
}
}
}, 1000);
} private void scanAppItem(AppItem item) {
// 如果我要复制每个APK到某个目录下假设耗时2s,每个APK都执行两秒后,整个界面就死了。
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} private void initInstalledApps() {
vecItems = new Vector<AppItem>();
final PackageManager pkgMag = getPackageManager();
listApps = pkgMag.getInstalledApplications(0);
for (int i = 0; i < listApps.size(); i++) {
final ApplicationInfo appInfo = listApps.get(i);
LinearLayout layoutAppItem = (LinearLayout) LayoutInflater.from(
this).inflate(R.layout.view_app_item, null);
ImageView imgView = (ImageView) layoutAppItem
.findViewById(R.id.img_app_icon);
imgView.setBackgroundDrawable(appInfo.loadIcon(pkgMag));
TextView txtAppName = (TextView) layoutAppItem
.findViewById(R.id.txt_app_name);
txtAppName.setText(appInfo.loadLabel(getPackageManager()));
TextView txtPackage = (TextView) layoutAppItem
.findViewById(R.id.txt_package_name);
txtPackage.setText(appInfo.packageName);
layoutInstalledApps.addView(layoutAppItem);
AppItem tmpItem = new AppItem(MainActivity.this, appInfo);
tmpItem.setView(layoutAppItem);
vecItems.add(tmpItem);
layoutAppItem.setTag(tmpItem);
}
}
}
另一个类:birthday1001.test.AppItempackage birthday1001.test;import java.io.File;import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.graphics.drawable.Drawable;
import android.widget.LinearLayout;public class AppItem {
private String packageName;
private String sourceDir;
private String appName;
private String processName;
private long apkSize;
private Drawable appIcon;
private int uid;
private File fileAPK;
private LinearLayout viewItem; public AppItem(Context context, ApplicationInfo appInfo) {
packageName = appInfo.packageName;
sourceDir = appInfo.sourceDir;
appName = appInfo.loadLabel(context.getPackageManager()).toString();
appIcon = appInfo.loadIcon(context.getPackageManager());
processName = appInfo.processName;
uid = appInfo.uid;
fileAPK = new File(sourceDir);
apkSize = fileAPK.length();
} public String getPackageName() {
return packageName;
} public String getSourceDir() {
return sourceDir;
} public String getAppName() {
return appName;
} public Drawable getAppIcon() {
return appIcon;
} public int getUid() {
return uid;
} public String getProcessName() {
return processName;
} public String getAPKSizeFormateString() {
String sizeStr = String.valueOf(apkSize * 1.0 / (1024)) + "KB";
return sizeStr;
} public void setView(LinearLayout v) {
viewItem = v;
} public LinearLayout getView() {
return viewItem;
}
}
一个名为layout_main界面的xml<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<LinearLayout
android:id="@+id/layout_installed_apps"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</LinearLayout>
</ScrollView>
</LinearLayout>另一个小界面的xml:view_app_item.xml<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:background="#ff000000">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:orientation="horizontal">
<ImageView android:id="@+id/img_app_icon"
android:layout_width="48dp" android:layout_height="48dp">
</ImageView>
<LinearLayout android:layout_width="fill_parent"
android:layout_height="wrap_content" android:orientation="vertical"
android:layout_weight="1">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/txt_app_name">
</TextView>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/txt_package_name">
</TextView>
</LinearLayout>
<ProgressBar android:id="@+id/app_item_progress_bar"
android:layout_width="wrap_content" android:layout_height="wrap_content">
</ProgressBar>
</LinearLayout>
<View android:layout_width="fill_parent" android:layout_height="1dp"
android:background="#ff00ffff"></View>
</LinearLayout>
AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="birthday1001.test" android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name"
android:screenOrientation="nosensor" android:debuggable="true">
<activity android:name=".MainActivity" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="3" />
</manifest> 
代码太长了,劳烦各位大大了...

解决方案 »

  1.   

    private void scanAppItem(AppItem item) {
            // 如果我要复制每个APK到某个目录下假设耗时2s,每个APK都执行两秒后,整个界面就死了。
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }你写的Thread.sleep(2000)是暂停的主线程2秒,假如你的ecItems.size()==10;
    那执行完后你的主线程将会暂停10s:
    你可以自己写个线程池来做你的操作,在scanAppItem方法中用线程线来处理你的操作(假如你的size()在10个左右你就不需要用线程池,直接在scanAppItem方法中新开线程执行就是的)
      

  2.   

    Android的基本设计,主线程是不允许暂停的。
      

  3.   

    主线程5s没有响应,就会报ANR了
    需要在另外的子线程中执行耗时操作
      

  4.   

    我晕,大家有没有看到我把scanAPKItem放在new Runnable()里了。难道这样不是放线程里了??