如何在AsyncTask中正确使用Intent和Uri数据

时间:2015-04-15 21:25:58

标签: android android-intent android-asynctask uri

我需要使用AsyncTask从网上下载图像。我想使用一个可以回到我的MainActivity的意图来做到这一点。下面的代码确实下载了图像我必须按一下后退按钮才能真正看到图像。我传入的Uri是我下载方法所需的数据来完成它的工作。

这是我的问题: 如何将Uri传递给AsyncTask,正确形成启动下载方法的意图,并返回具有该意图的调用活动?

另外请不要提起毕加索,我特别需要使用AsyncTask。

   private class DownloadAsyncTask extends AsyncTask<Uri, Void, Intent>{

    private Uri  mUri;

    public DownloadAsyncTask(Uri uri) {

        this.mUri = uri;
    }

    @Override
    protected void onPreExecute() {

        Toast.makeText(DownloadActivity.this, "Beginning download...", Toast.LENGTH_SHORT).show();
    };

    @Override
    protected Intent doInBackground(Uri... params) {

        Log.i(TAG, "in doInBackground()");
        Intent i = new Intent(DownloadActivity.this, MainActivity.class);
        //set the intent data to the result of the method that actually downloads this image
        i.setData(DownloadTools.downloadImage(DownloadActivity.this, mUri));
        setResult(RESULT_OK, i);

        return i;
    }

    protected void onPostExecute() {

        Toast.makeText(DownloadImageActivity.this, "Finished Download.", Toast.LENGTH_SHORT).show();

        finish();
    };
}

MainActivity回调:

    @Override
protected void onActivityResult(int requestCode,
                                int resultCode,
    if (resultCode == RESULT_OK) {
        if (requestCode == DOWNLOAD_IMAGE_REQUEST) {

            //use the path found in the data to open the image in the gallery.
            String address = data.getData().toString();
            Intent galleryIntent = makeGalleryIntent(address);

            // Start the Gallery Activity.
            startActivity(galleryIntent);
        }
    }

1 个答案:

答案 0 :(得分:1)

为什么要尝试使用意图执行此方法? 根据我的理解,你想要启动一个AynTask并将结果传回主要的活动,不是吗?要实现这一点,您应该使用和接口来实现CallBack。

public interface I_CallBackTask {

public void getResultFromAsynTask(String result);

}

private class DownloadAsyncTask extends AsyncTask<Uri, Void, String>{



private Uri  mUri;
public I_CallBackTask callback;

public DownloadAsyncTask(Uri uri) {

    this.mUri = uri;
}

@Override
protected void onPreExecute() {

    Toast.makeText(DownloadActivity.this, "Beginning download...", Toast.LENGTH_SHORT).show();
};

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

    //Do your background code for download here

    //return the result of your download: if is an image it could be byte[], ...


    return resultfrombackground;
}
//result same type as resultfrombackground

protected void onPostExecute(String result) {

    callback.getResultFromAsynTask(result);


};
}

//your main activity

public YourActivity implements CallBackTask{
// your Activity 


 //your code .....


//On your main activity start the asyntask and pass your uri in the parameter
DownloadAsyncTask asyntask = new DownloadAsyncTask(yourUri);
asyncTask.execute();
asyncTask.callback = this;



 @Override
public void getResultFromAsynTask(String result){
// do what you need with the result and start the new activity
}


}