【问题标题】:Asynctask doInBackground Methode never executeAsynctask doInBackground Methode 从不执行
【发布时间】:2015-10-03 16:21:58
【问题描述】:

我正在开发从 TMDB.com 获取电影数据的 APP 进入网格视图。所以问题是doInBackground 方法没有执行。它没有显示任何 LOG 消息,我没有收到任何错误,只是显示了空白屏幕
我尝试在onPostExecute 方法中设置适配器,而不是在OnCreateView 中设置适配器,但没有任何改变。

异步任务子类

 public class fetchmovies extends AsyncTask<String, Void, String[]> {
 private final String LOG_TAG = fetchmovies.class.getSimpleName();


@Override
protected String[] doInBackground(String... params) {
    if (params.length == 0) {
        return null;
    }
    HttpURLConnection urlConnection = null;
    BufferedReader reader = null;
    String moviejasonSTR = null;
    String size = "w185";
    String poster_path = "poster_path";
    String api_key = "my api key";

    try {
        final String base_move_url = " http://image.tmdb.org/t/p/";
        final String SORT_BY_PARM = "sort_by";
        final String Api_KEY_PARM = "api_key";

        Uri bulitUri = Uri.parse(base_move_url).buildUpon()
                .appendQueryParameter(SORT_BY_PARM, params[0])
                .appendQueryParameter(Api_KEY_PARM, api_key).build();

        URL url = new URL(bulitUri.toString());
        urlConnection = (HttpURLConnection) url.openConnection();
        urlConnection.setRequestMethod("GET");
        urlConnection.connect();

        // Read the input stream into a String
        InputStream inputStream = urlConnection.getInputStream();
        StringBuffer buffer = new StringBuffer();
        if (inputStream == null) {
            // Nothing to do.
            return null;
        }
        reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        while ((line = reader.readLine()) != null) {

            buffer.append(line + "\n");
        }
        if (buffer.length() == 0) {
            // Stream was empty.  No point in parsing.
            return null;
        }
        moviejasonSTR = buffer.toString();
        Log.v(LOG_TAG, "movie string: " + moviejasonSTR);
    } catch (IOException e) {
        Log.e(LOG_TAG, "Error ", e);


        return null;
    } finally {
        if (urlConnection != null) {
            urlConnection.disconnect();
        }
        if (reader != null) {
            try {
                reader.close();
            } catch (final IOException e) {
                Log.e(LOG_TAG, "Error closing stream", e);
            }
        }
        try {
            return getMoviesDatFromJason(moviejasonSTR);


        } catch (JSONException e) {
            Log.e(LOG_TAG, e.getMessage(), e);
            e.printStackTrace();
        }
    }


    return null;
}

private String[] getMoviesDatFromJason(String movieJasonStr) throws   JSONException {
    final String RESULT = "results";
    // final String OVERVIEW = "overview";
    //final String ORIGINAL_TITLE = "original_title";
    //final String VOTE_AVERAGE = "vote_average";
    final String POSTER_PATH = "poster_path";
    // final String RELEASE_DATE = "release_date";

    JSONObject movieJason = new JSONObject(movieJasonStr);
    JSONArray MOVIEARAY = movieJason.getJSONArray(RESULT);
    String[] imagearry = new String[MOVIEARAY.length()];
    for (int i = 0; i < MOVIEARAY.length(); i++) {
        JSONObject movie = MOVIEARAY.getJSONObject(i);
        String poster_path = movie.getString(POSTER_PATH);
        String poster_uril = "http://image.tmdb.org/t/p/w185/" +   poster_path;
        imagearry[i] = poster_uril;

    }


    return imagearry;
}


@Override
protected void onPostExecute(String[] result) {


}
}

基础适配器

 public class mcustomAdapter extends BaseAdapter {
        private Context context;
        private String[] posterURL;

        public mcustomAdapter(Context context, String[] posterUrl) {
            this.context = context;
            this.posterURL = posterUrl;

        }

        @Override
        public int getCount() {
            return posterURL.length;
        }

        @Override
        public Object getItem(int position) {
            return posterURL[position];
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            imageView = null; // created as a global view
            if (convertView == null) {
                imageView = new ImageView(context);
            } else {
                imageView = (ImageView) convertView;
            }
            Picasso.with(context).load(posterURL[position]).into(imageView);


            return imageView;
        }
    }

OnCreateView OnCreate OnStart

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,

                         Bundle savedInstanceState) {
    final View rootview = inflater.inflate(R.layout.fragment_main, container, false);
    imageView = (ImageView) rootview.findViewById(R.id.list_itempostr);
    grideview = (GridView) rootview.findViewById(R.id.movie_grid_view);
    grideview.setAdapter(movieadapter);
    movieadapter = new mcustomAdapter(getActivity(), imagearry);
    movieadapter.notifyDataSetChanged();
    grideview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        }
    });


    return rootview;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    updatemovies();

}

public void updatemovies() {
    String sortby = "popularity.asc";
    fetch.execute(sortby);

}

@Override
public void onStart() {
    super.onStart();
    //updatemovies();

}

FragmentMain

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivityFragment"
 >
    <GridView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/movie_grid_view"
    android:numColumns="auto_fit"
    android:verticalSpacing="5dp"
    android:horizontalSpacing="5dp"
        />

</FrameLayout>

图像视图

 <?xml version="1.0" encoding="utf-8"?>

<ImageView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/list_itempostr"



    />

主祭

    <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.exampel.android.mdb" >
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

【问题讨论】:

  • 我已经编辑了我的答案

标签: gridview android-asynctask baseadapter


【解决方案1】:

尝试使用TMDB api,这样会更容易获取数据。

将此添加到您的app/build.gradle

compile group: 'info.movito', name: 'themoviedbapi', version: '1.1'

然后像这样使用 AsyncTask:

class fetchMovies extends AsyncTask<String, Void, Void> {

        @Override
        protected Void doInBackground(String... params) {

            try {

                String sortBy = params[0];

                tmdbDiscover = new TmdbApi("YourApiKey").getDiscover();

                if (tmdbDiscover != null) {
                    resultsPage = tmdbDiscover.getDiscover(new Discover().sortBy(sortBy).page(1));

                    if(resultsPage != null) {
                        moviesList = resultsPage.getResults();
                    }
                }

            } catch (Exception e) {
                Log.i("Error:", e.toString());
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
            if(moviesList != null) {
                movieArrayList = populateMoviesList(moviesList);
                adapterMovies.setPosts(movieArrayList);
            }
        }
    }

我假设您正在 Android Developer Nanodegree 中制作项目 2,所以here 是相应的社区,您可以在其中找到许多关于项目和常见问题的不同问题/答案

【讨论】:

  • 很抱歉没有将我创建的整个代码发布为 fetchmovies 类对象
  • yh 再次抱歉,是的,我在 Android Developer 中制作了最终项目“1”
  • 谢谢兄弟,我正在使用 picasso 处理在基本适配器中加载电影海报,但我真的很想知道为什么我的 do inBackground 方法没有执行我需要做什么才能使其工作
  • 我建议您仔细检查您的 AsyncTask 并使用日志语句来检测您的代码何时停止工作(例如在 onCreate 和 updateMovies 中打印日志)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2011-12-05
  • 2011-05-04
相关资源
最近更新 更多