【问题标题】:How to send variables to class inside of Asynctask - Android [duplicate]如何将变量发送到 Asynctask 内部的类 - Android [重复]
【发布时间】:2013-07-16 19:24:45
【问题描述】:

我有一个异步任务,它使用 Asynctask 的 doInBackground() 方法中的 JSON 方法从数据库中收集 cmets、用户名和数字。然后在 onPostExecute() 方法中将这些数组转换为字符串。我希望将这些字符串发送到扩展 BaseAdapter 的类,如何将字符串发送到另一个类但仍让 BaseAdapter 在后台运行?这是我当前的代码,

    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();

这是我的日志

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)

【问题讨论】:

  • 为什么需要将 AsyncTask 放在 BaseAdapter 中?看来您可以在 Activity 中使用 Async,使用一些 getter 方法从 Adapter 获取所需的任何内容..然后将它们传递给您的 Async
  • 我这样说是因为它可以让您将需要在后台执行的操作与适配器分开。让 AsyncTask 担心背景/json 的东西,并让你的 onPostExecute/main 线程操作该逻辑的结果
  • noo,async 和 baseadpater 不在彼此的内部。异步收集字符串,然后假设将其发送到 Baseadapter。
  • 您的 BaseAdapter 类中有一个 AsyncTask。为什么需要这个?这就是我要问的
  • 他们都在Activity里面吗?

标签: android string class android-asynctask baseadapter


【解决方案1】:

由于它们都是Activity 的内部类,那么您应该能够使您的ListViewAdapter 引用成员变量,然后您可以在ListViewnotifyDataSetChanged() 上调用setAdapter()您的 Adapter 取决于您是更新还是最初设置它。

如果你这样做

ListView lstComments

Activity 的成员变量然后内部类将能够看到它。所以当你打电话时

  lstComments = (ListView)findViewById(android.R.id.list);
  lstComments.setAdapter(mycmlist);

在您的 AsyncTask 中,它应该会更新您的列表

【讨论】:

  • 我应该把 notifyDataSetChanged() 放在哪里?
  • 如果您刚开始下载列表并添加到Adapter,那么您不需要它。那是为了如果您要更新列表
  • 因为我按照您所说的对 ListView 进行了操作,但变量仍未正确发送到 Adapter。
  • mycmlist 是如何/在哪里被初始化的?
  • 在 asynctask 内部,就在创建字符串的地方,在 onPostExecute() 内部
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 2015-11-16
  • 2013-03-27
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多