【问题标题】:I can't to show the ProgressDialog in my AsyncTask我无法在 AsyncTask 中显示 ProgressDialog
【发布时间】:2015-02-11 16:57:18
【问题描述】:

我想在我的 AsyncTask 期间看到 ProgressDialog。为此,我使用以下代码:

public class ImageUploadActivity extends ActionBarActivity {

private Contact contact;
private ListView lvUploadImage;

private final String[] urls = {"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQBcE1SdhbR-3HCNtqQ13rw0GiatdcE7hBwpgF9h56dHPXuXTCmDA",
        "https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcR7T2KyVRzAF1hAETgUBDDiOQTE8ms-p7FAmioXEpkrJHMeM11Oag",
        "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRXfdGN9GEU3HIxpBAdd1RZuCsl1A1PQrAYOtTKDdjOb-eP2CK-",
        "http://scontent-a.cdninstagram.com/hphotos-xfa1/t51.2885-15/10809574_604759096337220_1443826749_a.jpg",
        "https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSRNOGN_QuCoCqlZCVjgB0NEIJaofQ669jeJDiarM_MotX-Cl4z",
        "http://scontent-b.cdninstagram.com/hphotos-xap1/t51.2885-15/924099_1375628606067848_267270589_a.jpg",
        "https://encrypted-tbn1.gstatic.com/images?q=tbn:ANd9GcTptRLPvaqq5Dsofu5d4xhxKxTz-hQCxN1GeSrOrPQzjxFX72Z6",
        "https://encrypted-tbn2.gstatic.com/images?q=tbn:ANd9GcRE3rqde5XY-OcdCuii8NL8PYbCfKFjKreQnVi4fKupuuzPviu1"
};

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

    contact = getIntent().getParcelableExtra("get_contact");
    lvUploadImage = (ListView) findViewById(R.id.lv_upload_image);
    lvUploadImage.setOnItemClickListener(getListener());
}

private AdapterView.OnItemClickListener getListener() {
    return new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            DownloadImageTask downloadImageTask = new DownloadImageTask();
            downloadImageTask.execute(urls[position]);

            try {
                Bitmap photo = downloadImageTask.get();
                if (photo == null) {
                    Toast.makeText(getApplicationContext(), "Failed to connect to the network", Toast.LENGTH_SHORT).show();
                    return;
                }
                contact.setPhoto(photo);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }

            Intent intent = new Intent(getApplicationContext(), CreateOrEditContactActivity.class);
            intent.putExtra(CreateOrEditContactActivity.ACTION_EXTRA_KEY, CreateOrEditContactActivity.ACTION_EDIT);
            intent.putExtra("edit_contact", contact);
            intent.putExtra("current_action", getIntent().getExtras().getString("current_action"));
            intent.putExtra(CreateOrEditContactActivity.ACTION_EXTRA_KEY, CreateOrEditContactActivity.ACTION_RETURN);
            startActivity(intent);
        }
    };
}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {

    private ProgressDialog pd;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        pd = new ProgressDialog(getApplicationContext());
        pd.setTitle("Downloading");
        pd.setMessage("Loading process, please wait");
        pd.show();
    }

    @Override
    protected Bitmap doInBackground(String... urls) {
        Bitmap bitmap = null;
        try {
            URL url = new URL(urls[0]);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            InputStream in = connection.getInputStream();

            if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) return null;
            bitmap = BitmapFactory.decodeStream(in);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        if (pd.isShowing()) pd.dismiss();
    }
}
}

但没有任何效果:(我得到了这个例外:

02-11 19:42:13.187  21798-21798/com.mycontacts.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.mycontacts.app, PID: 21798
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
        at android.view.ViewRootImpl.setView(ViewRootImpl.java:566)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:272)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
        at android.app.Dialog.show(Dialog.java:298)
        at com.mycontacts.app.activities.MainActivity$1.onItemClick(MainActivity.java:59)
        at android.widget.AdapterView.performItemClick(AdapterView.java:300)
        at android.widget.AbsListView.performItemClick(AbsListView.java:1143)
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:3044)
        at android.widget.AbsListView$3.run(AbsListView.java:3833)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

请告诉我是什么原因?

附:在 doInBackground() 方法中是否正确下载图像?

我明白了!谢谢你,伊曼纽尔。

【问题讨论】:

  • MainActivity 的第 59 行是什么?
  • 我是Bitmap photo = downloadImageTask.get();
  • 使用get() 违背了AsyncTask 的目的;它阻止调用Thread。请改用execute()
  • 为了清楚起见,我完全添加了我的课程。
  • 我不明白Bitmap photo = downloadImageTask.get();的意思

标签: android android-asynctask download connection progressdialog


【解决方案1】:

将您正在使用的上下文(您的活动)传递给 AsyncTask,并使用它来实例化 ProgressDialog。您可以在 AsyncTask 中定义一个新的构造函数并保存上下文,并在 onPreExecute 之后使用它。

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 2012-08-13
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多