【问题标题】:how can start intent after finishing download an image from url?完成从 url 下载图像后如何启动意图?
【发布时间】:2012-07-25 13:37:34
【问题描述】:

我需要在完成从 url 下载图像后开始我的意图,而不需要应用程序本身的用户进行任何操作。

这是我的 Activity,它首先会下载图像,然后会启动 Intent。

    //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 可以正常下载并正确下载图像,但代码的第二部分在下载图像时启动意图,因此图像将被损坏,从而导致异常。

如何在图像准备好并完成下载后启动意图?

【问题讨论】:

  • 你在哪里下载图片?我没看到电话。
  • 在 MyAsnyc 类中调用 new MyAsnyc().execute();
  • 你能显示你的清单文件吗?

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:
     public class YourClassName extends AsyncTask<String, Void, String > {
    
           protected void onPreExecute() { }
    
           protected String doInBackground(String... params) {}
    
           protected void onPostExecute(String result) {}
    }
    

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

    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(""); 
    

    【讨论】:

    • 我按照你说的做"" Intent intent1 = new Intent(Test_PROJECTActivity.this, DecodeActivity.class); ""
    • 我遇到了这个错误“”没有封闭的类型 Test_PROJECTActivity 在范围内可访问的实例“”
    【解决方案3】:

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

    【讨论】:

    • 但这会在这个语句中出错 Intent intent1 = new Intent(Test_PROJECTActivity.this, DecodeActivity.class);
    • 如果我按照你说的做,这部分 在 AsyncTask 的 onPostExecute() 方法中写入时会出错
    • 带有意图构造函数的参数
    • 这个错误 ""范围内没有 Test_PROJECTActivity 类型的封闭实例""
    • @Start,你应该将你的 Activity 实例提供给 AsyncTask 来执行这个方法,简单明了。
    猜你喜欢
    • 2019-12-24
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 2013-05-01
    • 2016-12-20
    • 2023-03-13
    • 2020-12-28
    • 1970-01-01
    相关资源
    最近更新 更多