完成从网址下载图片后如何开始意图?

时间:2012-07-25 13:37:34

标签: android android-intent android-image android-internet android-handler

我需要在完成从网址下载图片后开始我的意图,而不需要应用程序用户的任何操作。

这是我的活动,首先会下载图像,之后它将启动意图。

    //download image then start decod intent
public  void download(View v)
{
   //first download image 
    new MyAsnyc().execute();

      //then start this intent
      final Handler handler=new Handler();
     final Runnable r = new Runnable()
     {
         public void run() 
         {
             { 
                 Intent intent1 = new Intent(Test_PROJECTActivity.this, DecodeActivity.class);
                File path = Environment
                        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
                File file = new File(path, "DemoPictureX.png");
                Log.d("file", file.getAbsolutePath());
                intent1.putExtra("file", file.getAbsolutePath());
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                startActivity(intent1);
                }
         }
     };
 handler.postDelayed(r, 5000);
  }

MyAsnyc运行正常并正确下载图像,但第二部分来自下载图像时启动意图的代码,因此图像将被破坏,从而导致异常。

我如何让意图启动ONCE图像准备就绪并完成下载?

3 个答案:

答案 0 :(得分:1)

我认为您应该使用 AsyncTask ,它具有 onPostExecute onPreExecute 等功能。您可以轻松控制下载前后的内容

答案 1 :(得分:1)

 public class YourClassName extends AsyncTask<String, Void, String > {

       protected void onPreExecute() { }

       protected String doInBackground(String... params) {}

       protected void onPostExecute(String result) {}
}

使用doInBackground方法完成所有下载内容并从Intent方法开始新的onPostExecute,如下所示:

Intent i = new Intent(ClassName.this, TheClassToStart.class);
context.startActivity(i); 

如果您想将图片放到新活动中,请执行以下操作:

i.putExtras(...)

希望这有帮助!

关于无封闭实例的问题

如果您从其他活动启动AsyncTask,请将此活动的context传递给AsyncTask类。

public class YourClassName extends AsyncTask<String, Void, String > {
    Context mContext;

    public YourClassName(Context mContext) {
      this.mContext = mContext;
    }

    //other methods
}

从第一个Activity开始,以这种方式调用AsyncTask扩展的类:

new YourClassName(getApplicationContext()).execute(""); 

答案 2 :(得分:0)

您应该将Intent起始代码放在AsyncTask的{​​{1}}方法中。这将确保代码在正确的时间执行,并使异常处理更容易。希望这会有所帮助。