2013-01-14 153 views
2

我现在遇到了我的ArrayAdapter问题......我得到错误“构造函数ArrayAdapter(VideoPlay.ShowTitlesTask,int,int,ArrayList)未定义。”我究竟做错了什么?Android中的异步任务

的问题是在类ShowTitlesTask

package com.aer.illbehonest; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.ArrayList; 
import java.util.concurrent.ExecutionException; 

import net.sf.json.JSONArray; 
import net.sf.json.JSONObject; 
import net.sf.json.JSONSerializer; 

import org.apache.commons.io.IOUtils; 

import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class VideoPlay extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_video_play); 

     new ShowTitlesTask().execute(""); 
    } 

    class ShowTitlesTask extends AsyncTask<String, Void, ArrayList<String>> { 

    ArrayList<String> titlesList; 

    @Override 
protected ArrayList<String> doInBackground(String... args) { 

    URL jsonURL = null; 
    try { 
      jsonURL = new URL("http://gdata.youtube.com/feeds/api/users/illbehonest/uploads?v=2&alt=jsonc"); 
     } catch (MalformedURLException e3) { 
      e3.printStackTrace(); 
     } 
      URLConnection jc = null; 
      try { 
       jc = jsonURL.openConnection(); 
      } catch (IOException e2) { 
       e2.printStackTrace(); 
      } 
      InputStream is = null; 
      try { 
       is = jc.getInputStream(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
      String jsonTxt = null; 
      try { 
       jsonTxt = IOUtils.toString(is); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      JSONObject json = (JSONObject) JSONSerializer.toJSON(jsonTxt); 

      JSONObject jdata = json.getJSONObject("data"); 

      JSONArray jentry = jdata.getJSONArray("items"); 
      for (int entryNumber = 0; entryNumber<=25; entryNumber++){ 
        JSONObject entry = jentry.getJSONObject(entryNumber); 
        titlesList.add(entry.getString("title")); 
      } 

      return titlesList; 
    } 
    protected void onPostExecute(ArrayList<String> result) { 
     ListView listView = (ListView)VideoPlay.this.findViewById(R.id.videolist); 

     ArrayAdapter<String> adapter = new ArrayAdapter<String> (this, 
       android.R.layout.simple_list_item_1, android.R.id.text1, titlesList); 
     titlesList.setAdapter(arrayAdapter); 
     } 
    } 
} 

回答

0

,你将需要从doInBackground返回一个ArrayList和onPostExecute因为doInBackground执行完成时调用此方法添加到ArrayList中的ListView。创建您的AsyncTask为:

private class GetTitlesTask extends AsyncTask<String, Void, ArrayList<String>> { 
    Activity activity; 
     ArrayList<String> titlesList; 
     public GetTitlesTask(Activity activity){ 
      this.activity=activity; 
     } 
      @Override 
      protected void onPreExecute() { 
      // show progress bar here 
      } 
     @Override 
     protected ArrayList<String> doInBackground(String... args) { 

      titlesList=new ArrayList<String>; 

       // get titles here and add to titlesList ArrayList 

      return titlesList; //<< return titlesList ArrayList 
     } 
     @Override 
     protected void onPostExecute(ArrayList<String> result) { 

      // set result ArrayList as datasouce to Adapter here 
      ListView listview= 
       (ListView)activity.findViewById(R.id.videolist); 
     } 
    } 

,并从UI作为启动该GetTitlesTask的AsyncTask:

new GetTitlesTask(Your_Current_Activity.this).execute(""); 

到更多的了解的AsyncTask看到

http://developer.android.com/reference/android/os/AsyncTask.html

+0

当我尝试的ListView列表视图设置为findViewById(R.id.videolist)我得到一个错误说 “的方法findViewById(INT)是未定义的类型ShowTitlesTask” –

+0

@ZacCanoy:确保'ShowTitlesTask'是一个Activity的内部类,如果是,则使用ListView listView =(ListView)your_Activity.this.findViewById(R.id.videolist);如果ShowTitlesTask不是Activity的内部类,则需要传递Activity的Context非活动类 –

+0

你是什么意思的内部类?我是初学者。我试图“按原样”,它给了我“没有封闭类型VideoPlay的实例**(我的活动)**可以在范围内访问” –

0

当您使用AsyncTask你应该从onPostExecute方法更新您的用户界面。在这里设置适配器,然后就绪。

protected void onPostExecute(Void result) { 
titlesList.setAdapter(arrayAdapter);      
};