我在android中有一个应用程序,我从facebook
(某些名称和id)返回一些数据,在我返回此数据后,我使用适配器在列表视图中设置所有这些名称。
所有这些工作我都是在onCreate()
中完成的。我第一次使用方法getData()
从facebook返回一些名称,之后我调用了适配器。
问题是getData()
在array
字符串中返回将使用适配器设置的名称。现在,调用的适配器对此数组进行了一些处理。
我如何从网上返回这些名称,这部分工作缓慢,数组没有及时填充,所以当调用适配器时,数组仍然是空的,我会强行关闭。
我就是这样做的:
private String[] mStrings;
private String[] fName;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.invitefriends);
....................
/*In here I request for friends from facebook which ae set up in an array*/
mAsyncRunner.request("me/friends", new SampleRequestListener());
/*here is the adapter that processes the arrays returned in SampleRequestListener*/
adapter=new LazyAdapter1(this, mStrings,fName);
list.setAdapter(adapter);
}
/ 以下是从Facebook返回某些数组中的名称的SampleRequestListener /
public class SampleRequestListener extends BaseRequestListener{
int i;
public void onComplete(final String response, final Object state){
friends = new ArrayList<Friends>();
try{
Log.d("facebook-example","Response: " + response.toString());
JSONObject json = Util.parseJson(response);
JSONArray array = json.optJSONArray("data");
if(array!=null){
for(int i=0; i<array.length(); i++)
{
String name=array.getJSONObject(i).getString("name");
String id= array.getJSONObject(i).getString("id");
Friends f=new Friends(name,id);
friends.add(f);
Log.d(name,id);
}
mStrings = new String[friends.size()];
for(int i=0; i< mStrings.length; i++){
mStrings[i] = "http://graph.facebook.com/"+friends.get(i).getId()+"/picture?type=small";
}
fName = new String[friends.size()];
for(int i=0; i<friends.size(); i++)
{
fName[i]=friends.get(i).getName();
}
}
}
catch(JSONException e)
{
//do nothing
}
catch(FacebookError e)
{
e.getMessage();
}
}
}
最后这是适配器的正文:
公共类LazyAdapter1扩展了BaseAdapter {
private Activity activity;
private String[] data;
private String[] nume;
private static LayoutInflater inflater=null;
public ImageLoader imageLoader;
public LazyAdapter1(Activity a, String[] d, String[] f) {
activity = a;
data=d;
nume=f;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
imageLoader=new ImageLoader(activity.getApplicationContext());
}
public int getCount() {
return data.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public static class ViewHolder{
public TextView text;
public ImageView image;
}
public View getView(int position, View convertView, ViewGroup parent) {
//........
}
}
问题是后台线程没有及时返回mStrings[]
和fName[]
,因此当我尝试使用适配器对它们进行操作时它们仍然是空的。
所以有人可以告诉我该如何处理这件事才能正常工作?谢谢
答案 0 :(得分:0)
使用AsyncTask类并使用自定义类进行扩展。
这对于在后台进程中获取数据非常有用。
并且在获取数据时将其设置到适配器
中检查此链接
http://www.vogella.de/articles/AndroidPerformance/article.html
http://developer.android.com/reference/android/os/AsyncTask.html
http://www.xoriant.com/blog/mobile-application-development/android-async-task.html