2015-12-21 51 views
0

我正在创建一个从Tmdb Api获取电影列表的应用程序。 我的代码是主要的活动是如何从另一个java类创建MainActivity的内部类的AsyncTask对象

public class MainActivityFragment extends Fragment { 
    public class FetchImageTask extends AsyncTask<...>{ 
    // 
    } 
} 

而且我还有一个适配器类

public class MovieAdapter extends ArrayAdapter<MovieImage> { 

private static int page_nmber = 1; 

public MovieAdapter(Context context, List<MovieImage> objects) { 
    super(context, 0 , objects); 
} 

final String LOG_TAG = MovieAdapter.class.getSimpleName(); 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if(getCount() == position + 5){ 
     //Log.v(LOG_TAG, " last two images"); 
    } 

    MovieImage movieImage = getItem(position); 

    View rootView = LayoutInflater.from(getContext()) 
        .inflate(R.layout.list_item_movie, parent, false); 

    ImageView imageView = (ImageView) rootView.findViewById(R.id.list_item_movie_image); 
    Picasso.with(getContext()).load(movieImage.getImage_path()) 
      .placeholder(R.drawable.loading) 
      .fit() 
      .into(imageView); 

    return rootView; 
} 

public void fetchExtraImages(){ 
    MainActivityFragment.FetchImageTask fetchImageTask; 
    fetchImageTask = new MainActivityFragment.FetchImageTask(); 
    //Gives me error saying this is not an enclosing class 
} 

其实我想创建FetchImageTask对象的另一个对象,然后调用下一个页面(第2页) 结果和追加导致各自的适配器。

任何帮助表示赞赏。 :)

+0

可能像'MainActivityFragment objMainActivityFragment = new MainActivityFragment(); fetchImageTask = objMainActivityFragment.new FetchImageTask()' –

+1

'AsyncTask'不一定是内部类才行。您可以使用回调在其自己的单独的类文件中拥有'AsyncTask',但要在任何地方发布其结果。 – NoChinDeluxe

+1

看到这篇文章[这里](http://stackoverflow.com/questions/4070716/instantiating-inner-class)已经回答你的问题,如果你真的想让你的AsyncTask成为一个嵌套类,考虑将其声明为静态。 – alxscms

回答

2

我建议你不要在你的活动中使用异步任务。

1 - 你可以有通过使用相同的任务另一个classactivityfragment

2 - 你的活动将有单一职责(固体)

3 - 您可以使用callbacks传达给activityfragment或任何class

创建interface分离:

public interface FetchImageCallback{ 
    void onImageFetched(OBJECT);//replace by your 
} 

让您的活动implements FetchImageCallback这样你可以得到的图像,例如:

public class MainActivityFragment extends Fragment implements FetchImageCallback{ 

public void fetchExtraImages(){ 
    FetchImageTask fetchImageTask = new FetchImageTask(this); //this is your callback 
} 

void onImageFetched(OBJECT){ 
    //do what you want to do with the images fetched (OBJECT) 
} 
} 

如果你真的想使用的内部类(不推荐)只需声明FetchImageTask为静态等级:

public static class FetchImageTask{ 
    //some code 
} 
+0

谢谢。我已经将我的获取图像任务作为InnerClass移除,并将其放置为一个安全类。结果通过接口回调传递(即,MainActivityFragment中的listenerClass)。它工作正常。我已经请求tmdb api来获取电影列表。它只返回一个页面(有20个电影条目)。我想在第2页的getView()方法中调用FetchImageTask()。execute()方法(在自定义数组适配器中重写)。我遇到了问题 –

+0

最后我明白了。我需要将我的MainActivityFragment内部类(即接口列表)传递给Adapter。 .........感谢你们 –

相关问题