0
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目的は、そのコードを使用する必要性をなくすことでした。

更新: image.setImageBitmap(img) をポスト実行に配置したところ、機能しました。みんなありがとう!

4

3 に答える 3

3

から ui を更新することはできませんdoInbackground()doInbackgroundバックグラウンド スレッドで呼び出されます。Ui スレッドで Ui を更新する必要があります。onPostExecuteui スレッドで呼び出されます。doInbackground演算結果はへのパラメータonPostExecuteです。したがって、結果を返し、doInbackgroundUIを更新しonPostExecuteます。

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

上記のリンクの「The 4 steps」セクションの下のチェックトピック。

     image.setImageBitmap(img);

の ui を更新するonPostExecuteか、 を使用する必要がありますrunOnUiThread

しかし、UI を更新することをお勧めしますonPostExecute

     runOnUiThread(new Runnable() //run on ui thread
     {
          public void run() 
          { 
             // update ui       
          }
     });
于 2013-06-27T05:27:45.260 に答える
1

メソッドでUI操作をしていると思いますdoInBackground()

image.setImageBitmap(img);

onPostExecute()メソッドでこれを行う必要があります。

doInBackground() メソッド内で非 UI 操作のみを実行する必要があります。

于 2013-06-27T05:27:48.357 に答える
0

で UI を更新することはできません。UI を で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);
    }


}

また、ここでは variable について何か言及していますimage。Imageview をインフレートしてonPostExecute()から、イメージ ビットマップを設定する行を追加する必要があります。

于 2013-06-27T05:43:59.873 に答える