尝试将视图添加到RelativeLayout时出错

时间:2014-06-28 15:04:37

标签: android relativelayout

我正在尝试使用AsyncTask从远程数据库接收一些信息,并使用它在屏幕上生成dinamyc列表。首先,我执行AsyncTask,当它完成时,我调用我的Activity的方法来更改屏幕,但它会生成一个我无法解决的错误。

这是我的活动代码:

public class MainActivity extends Activity {
Button but;
ArrayList<String> array;
ArrayList<String> array2;
JSONArray players = null;
RelativeLayout rl;


@Override
protected void onStart(){
    super.onStart();

    Intent intent = getIntent();

    final String  s= intent.getStringExtra("firstKeyName");



    RelativeLayout.LayoutParams params;
    rl = (RelativeLayout) findViewById(R.id.marco);




         Hilo hilo = new Hilo(this, s);
         hilo.execute();




      }

protected void pantalla(final JSONArray players){


     RelativeLayout.LayoutParams params;
      DisplayMetrics metrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(metrics);

      final Integer h= metrics.heightPixels;
      final Integer w= metrics.widthPixels;


      Button b1 = new Button(this);
      params = new RelativeLayout.LayoutParams((int) (w*0.8), (int) (h*0.16));
      params.leftMargin = (int) (0);
      params.topMargin = (int) (h*0.5);

     rl.addView(b1,params);

}
}

我认为我的方法onCreate的代码不是必需的。 这是AsyncTask的代码

public class Hilo extends AsyncTask<Object,Void,Void> {

private MainActivity activity2;
 JSONArray players = null;
 String s;

    public Hilo(MainActivity activity, String s2)
    {
        activity2 = activity;
        s=s2;
    }

@Override
protected Void doInBackground(Object... arg0) {
    // TODO Auto-generated method stub
    //players = new JSONArray();

      if(hay_internet()){

          RestClient client = null;



         client = new RestClient("myurl");


           try {
               client.Execute(RestClient.RequestMethod.GET);
           } catch (Exception e) {

           }

           String response = client.getResponse();

           try {

             JSONObject jObject=new JSONObject(response);
           players = new JSONArray(jObject.getString("questions"));




              } catch (Exception e) {

                }


      }
           activity2.pantalla(players);
        return null;


}

public boolean hay_internet(){

    RestClient client = new RestClient("myurl");

    Integer i=0;
       try {
           client.Execute(RestClient.RequestMethod.GET);
       } catch (Exception e) {

       }

       String response = client.getResponse();

       try {

         JSONObject jObject=new JSONObject(response);
         JSONArray players = new JSONArray(jObject.getString("questions"));

          i=players.getJSONObject(0).getString("Jugador").toString().length();


          } catch (Exception e) {

            }

       return (i==7);
    }







}

方法hay_internet()仅用于验证是否存在Internet连接。

当我尝试使用RelativeLayout在方法pantalla()中添加视图时出现错误,这是我在onStart()方法中已经初始化的全局变量。

2 个答案:

答案 0 :(得分:0)

在引用setContentView之前,您错过了调用RelativeLayout方法。覆盖onCreate方法并将其命名为:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.<YourXmlContainingRelativelayout>);
}

<强> [更新]
罪魁祸首就是这个电话:

activity2.pantalla(players);

覆盖onPostExecute的{​​{1}}方法并从那里调用它。 android的原因是不允许你在后台线程中做UI相关的东西。您必须在主线程中执行与UI相关的内容

AsyncTask

答案 1 :(得分:0)

您无法在AsynkTask方法中更新/添加视图(即任何后台线程/方法) 你必须在UI线程上做。 AsynkTask的onPostExecute()在UI线程上执行,所以在onPostExecute()中调用你的方法。

也可以使用

 @Override
 public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(layoutfilename);
 }