Android从另一个线程更新Text_Widget

时间:2018-03-11 14:13:26

标签: android android-activity android-thread

我的加载屏幕很少,有 TextField ,当创建加载屏幕时,它会启动新的Thread。该线程有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;

}

}

1 个答案:

答案 0 :(得分:0)

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

更新ui
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元素。