2017-02-28 12 views
1

私はアンドロイドスタジオで新しく、ネットワーク操作のためにAsyncTaskを実行しようとしています。doInBackgroundタスクから戻り値を取得する方法は?

問題は、画像ビューで画像を設定できるように、そこから戻り変数を取得することです。 imgDisplay.setImageBitmap(var)

public class ZoomActivity extends Activity { 


    @SuppressLint("NewApi") 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_zoom); 

     Intent intent = getIntent(); 
     String url2 = intent.getStringExtra("image"); 


     ImageView imgDisplay; 
     Button btnClose; 


     imgDisplay = (ImageView) findViewById(R.id.imgDisplay); 
     btnClose = (Button) findViewById(R.id.btnClose); 


     //Bitmap var = return of doInBackground?????????? 
     imgDisplay.setImageBitmap(var); 


     btnClose.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       ZoomActivity.this.finish(); 
      } 
     }); 


    } 

    private class MyTask extends AsyncTask<String, Integer, String> { 

     @Override 
     protected String doInBackground(String... Params) { 
      String myString = Params[0]; 
      try { 
       URL url = new URL(URL???); //how to pass url2 var here? 
       HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
       connection.setDoInput(true); 
       connection.connect(); 
       InputStream input = connection.getInputStream(); 
       Bitmap myBitmap = BitmapFactory.decodeStream(input); 
       return myBitmap; ?????????? 
      } catch (IOException e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 
    } 

} 

どのような例ですか?

+0

そのURLの呼び出しが復帰を何?画像URLを返しますか? doInBackgroundの –

+0

?私はこの関数にurl2 varを渡す必要があります(このvarはURLを持つintentからです)。これをビットマップで変換してイメージビューを設定することができます –

答えて

3

まず、このasynctaskクラスを宣言:

class MyTask extends AsyncTask<String,Void,Bitmap>{ 

    @Override 
    protected Bitmap doInBackground(String... strings) { 
     String myString = Params[0]; 
     try { 
      URL url = new URL(myString); 
      Bitmap myBitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 
      return myBitmap; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     super.onPostExecute(bitmap); 
     imgDisplay.setImageBitmap(bitmap); 
    } 
} 

あなたzoomActivityの変更:この作品

public class ZoomActivity extends Activity { 
ImageView imgDisplay; 
@SuppressLint("NewApi") 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_zoom); 

    Intent intent = getIntent(); 
    String url2 = intent.getStringExtra("image"); 



    Button btnClose; 


    imgDisplay = (ImageView) findViewById(R.id.imgDisplay); 
    btnClose = (Button) findViewById(R.id.btnClose); 


    //call asynctask 
    new MyTask().execute(url2); 


    btnClose.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      ZoomActivity.this.finish(); 
     } 
    }); 


} 

希望

+1

そのコードがうまく動作しない場合は、URLからビットマップを取得するコードを変更してください。 'URL url =新しいURL(myString); HttpURLConnection connection =(HttpURLConnection)url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); ビットマップmyBitmap = BitmapFactory.decodeStream(入力); return myBitmap; ' –

+0

ありがとう、私は今それを試してみよう! –

+0

は完璧に機能します!ありがとうございます –

1

あなたのdoInBackgroundがオブジェクトを返すと、それが入力パラメータとしてメソッドonPostExecuteに行き、そしてあなたがIMAG

1

AsyncTask を設定できるので、その方法は、並列スレッドをUIスレッドで実行されていない。この本参考のため。 変更はあなたがAsyncTaskはその後

private class MyTask extends AsyncTask<String, Integer, Bitmap> { 

    @Override 
    protected Bitmap doInBackground(String... Params) { 
     String myString = Params[0]; 
     try { 
      URL url = new URL(myString); //how to pass url2 var here? 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream input = connection.getInputStream(); 
      Bitmap myBitmap = BitmapFactory.decodeStream(input); 
      return myBitmap; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    protected void onPostExecute(Bitmap result) { 
     //set your bitmap here to your imgDisplay 
    } 

} 

は、あなたが作業を開始する文字列の代わりにビットマップを返させてください

private class MyTask extends AsyncTask<String, Integer, BitMap> { 

    @Override 
    protected Bitmap doInBackground(String... Params) { 
     String myString = Params[0]; 
     try { 
      URL url = new URL(URL???); //how to pass url2 var here? 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream input = connection.getInputStream(); 
      Bitmap myBitmap = BitmapFactory.decodeStream(input); 
      return myBitmap; ?????????? 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

protected void onPostExecute(Bitmap result) { 
      //set the Image here. 
imgDisplay.setImageBitmap(result); 
    } 

    } 
1

にMYTASK

new MyTask().execute(/* urlString*/) 
+0

ありがとうございました! inside void onPostExecute 'imgDisplay.setImageBitmap(result);'を追加しようとしましたが、シンボルimgDisplayを解決できません...コンテキストが必要ですか? –

+1

メソッドの代わりにクラスのimgDisplayを宣言する必要があります。 –

+0

ありがとうございます! –

関連する問題