在main上运行AsyncTask时出错

时间:2013-06-27 05:25:14

标签: android android-asynctask

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

    @Override
    protected Void doInBackground(String... params) {
        // TODO Auto-generated method stub



        try {
            URL url  = new URL("http://c69282.r82.cf3.rackcdn.com/IMG_0755-Edit-4.jpg") ;
            URLConnection connect = url.openConnection();
            InputStream in = new BufferedInputStream(connect.getInputStream());
            Bitmap img = BitmapFactory.decodeStream(in);
            image.setImageBitmap(img);
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        return null;
    }


}

这是我的AsyncTask,当我尝试在主线程中运行它时,应用程序崩溃了。

如果我键入

,它可以正常工作
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().detectAll().penaltyLog().build();
        StrictMode.setThreadPolicy(policy);

然而,创建AsyncTask的重点是摆脱使用该代码的需要。

更新:我将post.setImageBitmap(img)放在post执行上并且它工作正常。谢谢你们!

3 个答案:

答案 0 :(得分:3)

您无法从doInbackground()更新ui。在后台线程上调用doInbackground。 Ui应该在ui线程上更新。在ui线程上调用onPostExecutedoInbackground计算的结果是onPostExecute的参数。因此,请在doInbackground中返回结果,并在onPostExecute中更新ui。

http://developer.android.com/reference/android/os/AsyncTask.html

上述链接中的4个步骤部分下的检查主题。

     image.setImageBitmap(img);

您应该在onPostExecute中更新ui或使用runOnUiThread

但我建议您在onPostExecute更新ui。

     runOnUiThread(new Runnable() //run on ui thread
     {
          public void run() 
          { 
             // update ui       
          }
     });

答案 1 :(得分:1)

我认为您正在使用doInBackground()方法进行UI操作。

image.setImageBitmap(img);

您应该使用onPostExecute()方法执行此操作。

您应该只在doInBackground()方法中执行非UI操作。

答案 2 :(得分:0)

您无法在doInBackground()更新自己的用户界面,只需在onPostExecute()更新自己的用户界面即可。 因此,请使用以下代码更新图像。

public class get extends AsyncTask<String,Void,Void>
{
Bitmap img;
    @Override
    protected Void doInBackground(String... params) {
        // TODO Auto-generated method stub


        try {
            URL url  = new URL("http://c69282.r82.cf3.rackcdn.com/IMG_0755-Edit-4.jpg") ;
            URLConnection connect = url.openConnection();
            InputStream in = new BufferedInputStream(connect.getInputStream());
            img = BitmapFactory.decodeStream(in);

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        return null;
    }

    @Override
    protected void onPostExecute(Bitmap result) 
    {
          image.setImageBitmap(img);
    }


}

此处您还提到了有关变量image的任何内容。您应该在onPostExecute()中对Imageview进行充气,然后添加用于设置图像位图的行。