1

我遇到了以下问题,希望有人能给我提示。

我有一个执行AsyncTask< String, Void, ArrayList<Custom object >>. 在doInBackground()函数中,我设置了一个新ArrayList的自定义对象,它也是返回值。在一个新创建的onPostExecute()方法中使用的方法中,它也设置为一个with so far so good!ArrayListArrayAdapter<Custom object>ListViewlv.setAdapter(adapter).

现在问题是:回到MainActivity我将再次需要那个适配器,因为我想通过调用adapter.add(items). 现在向它添加新项目!AsyncTaskListViewArrayAdapter,

但是因为我还有另一个类也需要执行它AsyncTask,所以我将该内部类AsyncTask更改为独立.java文件(CustomAsyncTask.java

-> 现在,当我尝试向它添加新项目时,ArrayAdapter它当然会抛出一个NullPointerException! ,也就是说,导致ArrayAdapter属于AsyncTask和在那里创建所以我试图将 MainActivity 中的ListViewArrayAdapter作为CustomAsyncTask构造函数使用它的参数那里但是那不起作用,ArrayAdapter在 MainActivity 中始终为 null 导致异常

任何想法如何解决?我真的很感激。

这里是 MainActivity.java 的代码:

// global variables
ArrayAdapter<Custom object> arrayadapter;
ListView listview;
ProgressBar progressbar;

...

protected void myMethod() {
    CustomAsyncTask hTask = new CustomAsyncTask(this, listview, progressbar, arrayadapter);
    hTaskPlaylist.execute(String sth);
}

...

protected void anotherMethod() {
    arrayadapter.add(item);
}

和 CustomAsyncTask.java 的代码:

package com.mypackage.test;

import java.util.ArrayList;

import android.content.Context;
import android.os.AsyncTask;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;

public class CustomAsyncTask extends AsyncTask<String, Void, ArrayList<Custom object>>{

    Context context;
    ListView listview;
    ProgressBar progressbar;
    ArrayAdapter<Custom object> arrayadapter;

    public CustomAsyncTask(Context con, ListView lv, ProgressBar pb, ArrayAdapter<Custom object> aa) {
        this.context = con;
        this.listview = lv;
        this.progressbar = pb;
        this.arrayadapter = aa;
    }

    @Override
    protected void onPreExecute() {
        listview.setVisibility(ListView.GONE);
        progressbar.setVisibility(ProgressBar.VISIBLE);
        super.onPreExecute();
    }

    @Override
    protected ArrayList<Custom object> doInBackground(String... params) {
            ArrayList<Custom object> list = new ArrayList<Custom object>();

            ... doing something and populating list
            return list;
    }

    @Override
    protected void onPostExecute(ArrayList<Custom object> list) {
        super.onPostExecute(list);

        arrayadapter = new ArrayAdapter<Custom object>(context, android.R.layout.simple_list_item_1, list);
        listview.setAdapter(arrayadapter);

        progressbar.setVisibility(ProgressBar.GONE);
                listview.setVisibility(ListView.VISIBLE);
    }

    }
}
4

2 回答 2

1

你可以让你的 ArrayAdapter 静态.. 然后任何时候你想访问它,你可以简单地说 CustomAsyncTask.arrayadapter.add(items); 您还可以将自己的函数添加到自定义 asynctask 类中。您可以创建类似 public ArrayAdapter<> getAdapter() 的东西。但请注意,无论如何,您将有多个线程访问/更改该对象,因此同步访问是一个好主意。

你可以试试这样的...

ArrayAdapter globalAdapter;
globalAdapter = new CustomAsyncTask().execute(/*your parameters here*/).get();
于 2012-07-10T17:18:09.777 回答
0

现在我尝试了,并将 'MainActivity作为参数而不是' 传递Context,这是我所做的更改:

public class CustomAsyncTask extends AsyncTask<String, Void, ArrayList<Custom object>>{

    **MainActivity activity**;
    ListView listview;
    ProgressBar progressbar;
    ArrayAdapter<Custom object> arrayadapter;

    public CustomAsyncTask(**MainActivity act**, ListView lv, ProgressBar pb, ArrayAdapter<Custom object> aa) {
        **this.activity = act;**
        this.listview = lv;
        this.progressbar = pb;
        this.arrayadapter = aa;
    }

    ...

    @Override
    protected void onPostExecute(ArrayList<Custom object> list) {
        super.onPostExecute(list);

        arrayadapter = new ArrayAdapter<Custom object>(context, android.R.layout.simple_list_item_1, list);
        listview.setAdapter(arrayadapter);
        **activity.arrayadapter = arrayadapter;**

        progressbar.setVisibility(ProgressBar.GONE);
        listview.setVisibility(ListView.VISIBLE);
    }

}

是的,它奏效了!谢谢乔尔,但我仍然想知道为什么我可以从中传递listviewMainActivity在该列表视图上调用一个函数AsyncTask并通常与该列表视图一起工作MainActivity,有什么想法吗?

Activity还有一个问题:传递对象而不是对象的唯一区别是正确的,Context您是否可以访问您在 ? 中定义的可用变量和方法Activity

于 2012-07-11T09:45:17.263 回答