Android 我能';t在我的异步任务中显示ProgressDialog

Android 我能';t在我的异步任务中显示ProgressDialog,android,android-asynctask,download,connection,progressdialog,Android,Android Asynctask,Download,Connection,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-3HC

我希望在异步任务期间看到一个对话框。为此,我使用以下代码:

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();
    }
}
}
请告诉我原因是什么

另外,我是否使用doInBackground()方法正确下载图像


我得到了!谢谢您,Emmanuel。

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

MainActivity的第59行中的内容之后使用它。它是
Bitmap photo=downloadImageTask.get()get()
违背了
AsyncTask
的目的;它阻止调用
线程
。改为使用
execute()
。我完全添加了我的类来说明问题。我不理解
Bitmap photo=downloadImageTask.get()的意义
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)