J'ai une asynctask qui rassemble les commentaires, les noms d'utilisateur et les nombres d'une base de données en utilisant une méthode JSON dans la méthode doInBackground() de la asynctask. Ces tableaux sont ensuite convertis en chaînes dans la méthode onPostExecute(). Je veux que ces chaînes soient envoyées à une classe qui étend BaseAdapter, comment puis-je envoyer les chaînes à une autre classe mais toujours faire fonctionner le BaseAdapter en arrière-plan? Voici mon code actuel,Comment envoyer des variables à classer dans Asynctask - Android
class CreateCommentLists extends BaseAdapter{
Context ctx_invitation;
String[] listComments;
String[] listNumbers;
String[] listUsernames;
public CreateCommentLists(Context ctx_invitation, String[] test1, String[] test2, String[] test3)
{
super();
this.ctx_invitation = ctx_invitation;
listComments = test1;
listNumbers = test2;
listUsernames = test3;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listComments.length;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return listComments[position];
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View v = null;
try
{
String inflater = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater li = (LayoutInflater)ctx_invitation.getSystemService(inflater);
v = li.inflate(R.layout.list_item, null);
TextView commentView = (TextView)v.findViewById(R.id.listComment);
TextView NumbersView = (TextView)v.findViewById(R.id.listNumber);
TextView usernamesView = (TextView)v.findViewById(R.id.listPostedBy);
commentView.setText(listComments[position]);
NumbersView.setText(listNumbers[position]);
usernamesView.setText(listUsernames[position]);
}
catch(Exception e)
{
e.printStackTrace();
}
return v;
}
}
final CreateCommentLists mycmlist = new CreateCommentLists(this, test1, test2, test3);
class loadComments extends AsyncTask<JSONObject, String, JSONObject> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
}
protected JSONObject doInBackground(JSONObject... params) {
JSONObject json2 = CollectComments.collectComments(usernameforcomments, offsetNumber);
return json2;
}
@Override
protected void onPostExecute(JSONObject json2) {
try {
if (json2.getString(KEY_SUCCESS) != null) {
registerErrorMsg.setText("");
String res2 = json2.getString(KEY_SUCCESS);
if(Integer.parseInt(res2) == 1){
JSONArray commentArray = json2.getJSONArray(KEY_COMMENT);
String test1[] = new String[commentArray.length()];
for (int i=0; i<commentArray.length(); i++) {
comments[i] = commentArray.getString(i);
}
JSONArray numberArray = json2.getJSONArray(KEY_NUMBER);
String test2[] = new String[] numberArray.length()];
for (int i=0; i<numberArray.length(); i++) {
numbers[i] = numberArray.getString(i);
}
JSONArray usernameArray = json2.getJSONArray(KEY_USERNAME);
String test3[] = new String[usernameArray.length()];
for (int i=0; i<usernameArray.length(); i++) {
usernames[i] = usernameArray.getString(i);
}
ListView lstComments = (ListView)findViewById(android.R.id.list);
lstComments.setAdapter(mycmlist);
}//end if key is == 1
else{
// Error in registration
registerErrorMsg.setText(json2.getString(KEY_ERROR_MSG));
}//end else
}//end if
} //end try
catch (JSONException e) {
e.printStackTrace();
}//end catch
}
}
new loadComments().execute();
Voici mon logcat
07-16 15:21:15.719: W/dalvikvm(19691): threadid=1: thread exiting with uncaught exception (group=0x40ac9228)
07-16 15:21:15.739: E/AndroidRuntime(19691): FATAL EXCEPTION: main
07-16 15:21:15.739: E/AndroidRuntime(19691): java.lang.NullPointerException
07-16 15:21:15.739: E/AndroidRuntime(19691): at com.example.DashboardActivity$1CreateCommentLists.getCount(DashboardActivity.java:404)
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.widget.ListView.setAdapter(ListView.java:460)
07-16 15:21:15.739: E/AndroidRuntime(19691): at com.example.DashboardActivity$1loadComments.onPostExecute(DashboardActivity.java:539)
07-16 15:21:15.739: E/AndroidRuntime(19691): at com.example.DashboardActivity$1loadComments.onPostExecute(DashboardActivity.java:1)
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.os.AsyncTask.finish(AsyncTask.java:602)
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.os.AsyncTask.access$600(AsyncTask.java:156)
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.os.Handler.dispatchMessage(Handler.java:99)
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.os.Looper.loop(Looper.java:154)
07-16 15:21:15.739: E/AndroidRuntime(19691): at android.app.ActivityThread.main(ActivityThread.java:4945)
07-16 15:21:15.739: E/AndroidRuntime(19691): at java.lang.reflect.Method.invokeNative(Native Method)
07-16 15:21:15.739: E/AndroidRuntime(19691): at java.lang.reflect.Method.invoke(Method.java:511)
07-16 15:21:15.739: E/AndroidRuntime(19691): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-16 15:21:15.739: E/AndroidRuntime(19691): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-16 15:21:15.739: E/AndroidRuntime(19691): at dalvik.system.NativeStart.main(Native Method)
Pourquoi exactement avez-vous besoin AsyncTask être à l'intérieur de votre BaseAdapter? Il semble que vous pourriez avoir votre Async dans votre activité, obtenir ce dont vous avez besoin de votre adaptateur en utilisant des méthodes de getter ... et les passer dans votre Async –
Je dis cela parce qu'il vous permettra de séparer les choses que vous devez faire en arrière-plan de votre adaptateur Laissez l'AsyncTask s'inquiéter de l'arrière-plan/json, et laissez votre thread principal onPostExecute/manipuler les résultats de cette logique –
noo, l'async et baseadpater ne sont pas à l'intérieur de l'autre. L'async rassemble des chaînes et est supposé l'envoyer à Baseadapter. –