android - Glide 库在 AsyncTask.doInBackground 中停止

标签 android android-asynctask fragment android-glide

我有一个从数据库检索到的图像 URL,我想在 ImageView 中显示它。我使用 Glide 库来实现此目的,但在运行 doInBackground 时出现 Exception

public class Main extends Fragment implements OnClickListener {

    private static String url = "http://timit.ir/select/select_pro";
    private static final String TAG_SUCCESS = "success";
    private static final String TAG_PRODUCTS = "product";
    private static final String TAG_PID = "Pro_ID";
    public static final String TAG_PIMAGE = "Url";
    public static final String TAG_PNAME = "Pro_Name";
    public static final String TAG_PRICE = "Price";
    public static final String TAG_DESCRIPTION = "description";
    public static final String TAG_OLDPRICE = "oldPrice";
    public static final String TAG_COMPANYNAME = "companyName";
    public List<Card> cardList;

    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.frag_main, container, false);

        l1 = (LinearLayout)rootView.findViewById(R.id.horizontal1);
        l2 = (LinearLayout)rootView.findViewById(R.id.horizontal2);

        new LoadAllProducts().execute();

        return rootView;
    }

    class LoadAllProducts extends AsyncTask<String, String, List<Card>> {
        @Override protected List<Card> doInBackground(String... args) {

            cardList = new ArrayList<Card>();
            JSONObject json = jParser.makeHttpRequest(url, "GET", params);

            // Check your log cat for JSON reponse
            Log.d("All Products: ", json.toString());

            try {
                // Checking for SUCCESS TAG
                int success = json.getInt(TAG_SUCCESS);

                if (success == 1) {
                    // products found
                    // Getting Array of Products
                    products = json.getJSONArray(TAG_PRODUCTS);

                    // looping through All Products
                    for (int i = 0; i < products.length(); i++) {
                        JSONObject c = products.getJSONObject(i);

                        Card card = new Card(getActivity());

                        Log.d("url:", c.getString(TAG_PIMAGE));
                        Glide.with(Main.this).load(c.getString(TAG_PIMAGE)).into(card.productThumbnailImage);

                        card.productId = c.getString(TAG_PID);
                        card.productName.setText(c.getString(TAG_PNAME));
                        card.price.setText(c.getString(TAG_PRICE));
                        card.description.setText(c.getString(TAG_DESCRIPTION));
                        card.companyName.setText(c.getString(TAG_COMPANYNAME));
                        card.oldPrice.setText(c.getString(TAG_OLDPRICE));

                        cardList.add(card);
                    }
                    return cardList;
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return cardList;
        }

        @Override protected void onPostExecute(List<Card> lcard) {
            super.onPostExecute(lcard);
            if (lcard.size() != 0) {
                for (int i = 0; i < lcard.size(); i++) {
                    l1.addView(lcard.get(i));
                }
            }
        }
    }
}

我的日志:

07-02 11:38:59.506: D/url:(4967): http://timit.ir/product_pic /iphone6plusthumnail.png

最佳答案

您无法在后台线程上调用 .into(ImageView)
我很确定您的日志中有类似的内容:

E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
    Process: net.twisterrob.app, PID: 11027
    java.lang.RuntimeException: An error occured while executing doInBackground()
    ...
Caused by:
    java.lang.IllegalArgumentException: You must call this method on the main thread
    ...

要修复此问题,请将 PIMAGE 字符串存储在 Card 中,然后存储在 onPostExecute 中:

Card card = lcard.get(i);
Glide.with(Main.this).load(card.imageUrl).into(card.productThumbnailImage);

关于android - Glide 库在 AsyncTask.doInBackground 中停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31184113/

相关文章:

Android Studio 模拟器 : Unhandled exit 1d (Mac OS : Big Sur Beta)

java - 单击 View 以外的任何内容时,如何将 View 设置为 "invisible"或 "gone"

android - 在 Fragment 中添加 onOptionsItemSelected 调用

android - 如何使用通知 addAction 调用方法或电话号码

android - 在本地打包和分发 ios 应用程序

java - 当 AsyncTask 的 doInBackground 内部时列表读为空

java - 在 doInBackground 中获取变量 退出 AsyncTask

java - Android:并发后台作业的设计(Service、IntentService 还是 AsyncTask?)

android - fragment 和处理方向变化

java - 将监听器传递给 Android 中的自定义 fragment