我正在尝试使用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()方法中已经初始化的全局变量。
答案 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);
}