0

我的加载屏幕很少有TextField,当加载屏幕创建时它会启动新线程。该线程有 3 件事要做,1)为扫描类创建新对象并运行它的扫描方法 2)在扫描方法中如果它变得棘手,它应该使用setStatus更新状态,然后调用方法 updateWidget 但它返回“ android.view.View android.view.Window.findViewById(int)' 在空对象引用上“和 3) 使用 setPackages 返回所有包。那么我如何从线程中获取小部件,还有关于我提到的第 3 部分的额外问题是正确的方法吗?

public class LoadingScreen extends Activity  {
private String status="";
List<ApplicationInfo> packages;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.loadingscreen_layout);
    updateWidget();

    try {
        startLoadingScreen();
    }catch (Exception e){
        Log.e("Scanner","Scanner",e);
    }

}

public void startLoadingScreen(){

    new Thread(new Runnable() {
        @Override
        public void run() {

            Scanner scanner = new Scanner();
            setPackages(scanner.Scan());
            changeIntent();
            finish();

        }
    });

}

public void setStatus(String status) {
    this.status = status;
}
void updateWidget(){
    TextView scanStatus  =  findViewById(R.id.statusView);
    scanStatus.setText(status);
}
private void changeIntent(){
    Intent intent = new Intent(this,DisplayClass.class);
    startActivity(intent);
}

public void setPackages(List<ApplicationInfo> packages) {
    this.packages = packages;
}

}

扫描类

public class Scanner extends Activity{
private LoadingScreen loadingScreen = new LoadingScreen();
List <android.content.pm.ApplicationInfo> Scan(){
    loadingScreen.setStatus("Scanning");
    loadingScreen.updateWidget();
    final PackageManager pm = getPackageManager();
    //get a list of installed apps.
    List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
    return packages;

}

}
4

1 回答 1

0

在您的新线程run()方法中,您可以尝试使用更新 uirunOnUiThread

try {
    Activity_name.this.runOnUiThread(new Runnable() {
     @Override
           public void run() {
                            //update ui views
                            btn.setText("some_text");
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

或者,您可以使用AsyncTask类从非 ui 线程更新 ui 元素。

于 2018-03-11T15:40:35.343 回答