Android 异步任务数组创建

Android 异步任务数组创建,android,android-asynctask,Android,Android Asynctask,我正在尝试为我的Android项目创建AsyncTask数组 将数据分配给TextView的。我需要为每个城市数据分别执行任务 我的单一异步任务工作正常,所以我认为主要方法是好的。 当我尝试创建任务数组时,问题就开始了 I获取错误尝试在空引用上调用虚方法 数组任务和单个任务执行完全相同的代码,所以问题一定是我如何创建数组 我张贴整个主要活动,以显示我试图做什么。使用单任务和阵列任务。 如果有任何帮助,我将不胜感激 private LinearLayout editLayout; private

我正在尝试为我的Android项目创建AsyncTask数组 将数据分配给TextView的。我需要为每个城市数据分别执行任务

我的单一异步任务工作正常,所以我认为主要方法是好的。 当我尝试创建任务数组时,问题就开始了

I获取错误
尝试在空引用上调用虚方法

数组任务和单个任务执行完全相同的代码,所以问题一定是我如何创建数组

我张贴整个主要活动,以显示我试图做什么。使用单任务和阵列任务。 如果有任何帮助,我将不胜感激

private LinearLayout editLayout;
private LinearLayout layout1;
private LinearLayout layout2;
private LinearLayout layout3;
private LinearLayout layout4;
int n;
TextView[] city = new TextView[10];
TextView[] time = new TextView[10];
TextView[] temperature = new TextView[10];


private ImageView delete1;
private ImageView delete2;
private ImageView delete3;
private ImageView delete4;

private ImageView condition1;
private ImageView condition2;
private ImageView condition3;
private ImageView condition4;

Weather weather = new Weather();
Task task = new Task();
Task task1 = new Task();
private Task[] myTasks = new Task[10];


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);



    editLayout = (LinearLayout) findViewById(R.id.layEdit);
    layout1 = (LinearLayout) findViewById(R.id.lay1);
    layout2 = (LinearLayout) findViewById(R.id.lay2);
    layout3 = (LinearLayout) findViewById(R.id.lay3);
    layout4 = (LinearLayout) findViewById(R.id.lay4);

    city[0] = (TextView) findViewById(R.id.city1);
    city[1] = (TextView) findViewById(R.id.city2);
    city[2] = (TextView) findViewById(R.id.city3);
    city[3] = (TextView) findViewById(R.id.city4);

    time[0] = (TextView) findViewById(R.id.time1);
    time[1] = (TextView) findViewById(R.id.time2);
    time[2] = (TextView) findViewById(R.id.time3);
    time[3] = (TextView) findViewById(R.id.time4);

    temperature[0] = (TextView) findViewById(R.id.temp1);
    temperature[1] = (TextView) findViewById(R.id.temp2);
    temperature[2] = (TextView) findViewById(R.id.temp3);
    temperature[3] = (TextView) findViewById(R.id.temp4);

    delete1 = (ImageView) findViewById(R.id.delete1);
    delete2 = (ImageView) findViewById(R.id.delete2);
    delete3 = (ImageView) findViewById(R.id.delete3);
    delete4 = (ImageView) findViewById(R.id.delete4);

    condition1 = (ImageView) findViewById(R.id.sun1);
    condition2 = (ImageView) findViewById(R.id.sun2);
    condition3 = (ImageView) findViewById(R.id.sun3);
    condition4 = (ImageView) findViewById(R.id.sun4);
    //weatherData("Paris, France");

    //weatherData("Paris, France", 0);
    loadTask(1,"Dublin, Ireland" );




private void loadTask(int sInt, String city){
    this.n=n;
    myTasks[sInt].execute(new String[]{city + "&APPID="+ WeatherApiNumber + "&units=metric"});
}
public void weatherData(String city, int n){
    this.n=n;
    task1.execute(new String[]{city + "&APPID="+ WeatherApiNumber + "&units=metric"});

}
private class Task extends AsyncTask<String, Void, Weather>{

    @Override
    protected Weather doInBackground(String... params) {
        String data = ((new WeatherClient()).getWeatherData(params[0]));
        weather = Parser.getWeather(data);

        return weather;
    }
    @Override
    protected void onPostExecute(Weather weather) {
        super.onPostExecute(weather);

        cityData(n);

    }

}
public void cityData(int n){

    city[n].setText(weather.place.getCity());
    time[n].setText(Integer.toString(weather.place.getTimeZone()));
    temperature[n].setText(Double.toString(weather.temp.getTemp()).substring(0,2));
    //task.cancel(true);


}
public void cityData2(int n){
    ;
    city[n].setText(weather.place.getCity());
    time[n].setText(Integer.toString(weather.place.getTimeZone()));
    temperature[1].setText(Double.toString(weather.temp.getTemp()).substring(0,2));
    //task.cancel(true);

    }
}
private LinearLayout编辑布局;
私人线路布局1;
私人线路布局2;
私人线路布局3;
私人线路布局布局4;
int n;
TextView[]城市=新TextView[10];
TextView[]时间=新建TextView[10];
TextView[]温度=新TextView[10];
私有图像视图delete1;
私有图像视图删除2;
私有图像视图删除3;
私有图像视图删除4;
私有图像视图条件1;
私有图像视图条件2;
私有图像视图条件3;
私有图像视图条件4;
天气=新天气;
任务=新任务();
任务task1=新任务();
私有任务[]myTasks=新任务[10];
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
editLayout=(LinearLayout)findViewById(R.id.layEdit);
布局1=(线性布局)findViewById(R.id.lay1);
布局2=(线性布局)findViewById(R.id.lay2);
布局3=(线性布局)findViewById(R.id.lay3);
布局4=(线性布局)findViewById(R.id.lay4);
城市[0]=(TextView)findViewById(R.id.city1);
城市[1]=(TextView)findViewById(R.id.city2);
城市[2]=(TextView)findViewById(R.id.city3);
城市[3]=(TextView)findViewById(R.id.city4);
时间[0]=(TextView)findViewById(R.id.time1);
时间[1]=(TextView)findViewById(R.id.time2);
时间[2]=(TextView)findViewById(R.id.time3);
时间[3]=(TextView)findViewById(R.id.time4);
温度[0]=(TextView)findViewById(R.id.temp1);
温度[1]=(TextView)findViewById(R.id.temp2);
温度[2]=(TextView)findViewById(R.id.temp3);
温度[3]=(TextView)findViewById(R.id.temp4);
delete1=(ImageView)findViewById(R.id.delete1);
delete2=(ImageView)findViewById(R.id.delete2);
delete3=(ImageView)findViewById(R.id.delete3);
delete4=(ImageView)findViewById(R.id.delete4);
条件1=(ImageView)findViewById(R.id.sun1);
条件2=(ImageView)findViewById(R.id.sun2);
条件3=(ImageView)findViewById(R.id.sun3);
条件4=(ImageView)findViewById(R.id.sun4);
//weatherData(“法国巴黎”);
//气象数据(“法国巴黎”,0);
loadTask(1,“爱尔兰都柏林”);
专用void加载任务(int sInt,String city){
这个,n=n;
myTasks[sInt].execute(新字符串[]{city+“&APPID=“+WeatherApiNumber+”&units=metric”});
}
公共void天气数据(字符串城市,int n){
这个,n=n;
task1.execute(新字符串[]{city+”&APPID=“+WeatherApiNumber+”&units=metric”});
}
私有类任务扩展了异步任务{
@凌驾
受保护的天气背景(字符串…参数){
字符串数据=((new WeatherClient()).getWeatherData(参数[0]);
weather=Parser.getWeather(数据);
回归天气;
}
@凌驾
执行后受保护的空(天气){
super.onPostExecute(天气);
城市数据(n);
}
}
公共无效城市数据(int n){
city[n].setText(weather.place.getCity());
time[n].setText(Integer.toString(weather.place.getTimeZone());
温度[n].setText(Double.toString(weather.temp.getTemp()).substring(0,2));
//任务。取消(true);
}
公共无效城市数据2(int n){
;
city[n].setText(weather.place.getCity());
time[n].setText(Integer.toString(weather.place.getTimeZone());
温度[1].setText(Double.toString(weather.temp.getTemp()).substring(0,2));
//任务。取消(true);
}
}

您没有向任务数组myTasks分配任何内容

在这一行中,您只是初始化数组,而不是数组项

private Task[] myTasks = new Task[10];

您应该在某个时刻将任务分配给myTasks中的单元格,然后才对其调用execute

类似myTasks[0]=new task()的可能重复项;myTasks[1]=新任务();myTasks[2]=新任务();myTasks[3]=新任务();?确切地但是,为什么在启动这些AsyncTast对象后需要对其进行引用呢?您应该使用一些支持列表或数组(AdapterView)的本机视图,如RecyclerView。关于AsyncTasks的另一件事是,当您同时启动多个任务时,它们将不会并行运行,除非您使用执行器显式定义它们。默认情况下,它们一个接一个地运行,这是默认行为。如果要覆盖它,请使用executeonexecutor