0

这是我的主要活动:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
}

这是将执行线程的类

public class Ads implements Runnable {

    private Activity activity;

    public Ads(Activity activity) {
        // TODO Auto-generated constructor stub
        this.activity = activity;
        new Thread(this).start();
    }

    @Override
    public void run() {
        FrameLayout layout = new FrameLayout(activity);
        layout.setBackgroundColor(Color.BLACK);
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(300, 75, Gravity.CENTER);
        TextView txt = new TextView(activity);
        txt.setText("ASD");
        layout.addView(txt);
        activity.getWindow().addContentView(layout, params);
    }

}

我运行了这段代码,但我的应用程序无法启动。如何为当前活动添加布局?请帮助我,谢谢

4

2 回答 2

2

您无法从工作线程初始化您的 UI。您必须在主线程中执行此操作。线程将仅用于进行一些复杂的计算。一切都在这里:http: //developer.android.com/guide/components/processes-and-threads.html

您可以添加一个 initUI 功能

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initUI();
}


private void initUI() {
    FrameLayout layout = new FrameLayout(this);
    layout.setBackgroundColor(Color.BLACK);
    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(300, 75, Gravity.CENTER);
    TextView txt = new TextView(this);
    txt.setText("ASD");
    layout.addView(txt);
    getWindow().addContentView(layout, params);
}

@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;
}
于 2013-06-09T16:12:05.600 回答
2

如果 Class在一个线程Adsrun()执行,那不是主 UI 线程(onCreate()执行的线程),那么在内部run()您无法更改 UI 视图。

因此,使用以下代码执行对 UI 进行更改的代码runOnUIThread()

runOnUIThread(new Runnable{
 @Override
 public void run(){
   //make changes to UI here--
 }
});

顺便说一句,您可以onCreate()只放入该代码,它并没有做太多工作。

此外,这篇培训文章详细解释了与 UI 线程的通信。

于 2013-06-09T16:16:09.527 回答