URLからTextViewに画像を読み込もうとすると、1つのことを除いてすべてうまくいきます。ImageGetter から結果を返そうとすると、コード海峡の例外部分にジャンプして、上記のすべてのコードをスキップして例外なしで行を返します。
これがコードです。
package net.cosplace.tabun;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.text.Html;
import android.text.Html.ImageGetter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.Spanned;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void TabunLogin(View v)
{
TextView txt = (TextView) findViewById(R.id.textView1);
AsyncTask<String, Void, Spanned> r = new RetreiveFeedTask().execute();
}
class RetreiveFeedTask extends AsyncTask<String, Void, Spanned> {
private Exception exception;
protected Spanned doInBackground(String... urls) {
try
{
String inputLine = "";
String buf = "";
try
{
URL yahoo = new URL("http://www.cosplace.net/photo.php");
URLConnection connection = yahoo.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while ((inputLine = in.readLine()) != null)
buf += inputLine;
in.close();
}
catch(Exception e)
{
buf = "fail";
}
ImageGetter imgGetter = new ImageGetter(){
@Override
public Drawable getDrawable(String source){
try
{
source = "http://www.cosplace.net/"+source;
URL url = new URL(source);
InputStream is = url.openStream();
Bitmap b = BitmapFactory.decodeStream(is);
Drawable d = new BitmapDrawable(getResources(),b);
return d;
}
catch (Exception e)
{
System.out.println("Exc="+e);
return null;
}
}
};
Spanned s = Html.fromHtml(buf,imgGetter, null);
return s;
}
catch (Exception e)
{
this.exception = e;
return null;
}
}
protected void onPostExecute(Spanned result) {
// TODO: check this.exception
// TODO: do something with the feed
TextView txt = (TextView) findViewById(R.id.textView1);
txt.setText(result);
}
}
}
したがって、ImageGetter に移動すると、URL に正常に接続し、データを取得し、ビットマップを作成して描画可能に変換しますが、描画可能を返す直前にジャンプして、例外なしで例外部分の null 行を返します。何が問題なのかわからないだけです。
それを機能させるために管理します。try と catch の近くのコードを再編成しただけで、すべてのメソッドで唯一の return derective になります。そして、setBounds を追加しました。
Drawable d = null;
try
{
source = "http://www.cosplace.net/"+source;
URL url = new URL(source);
InputStream is = url.openStream();
Bitmap b = BitmapFactory.decodeStream(is);
d = new BitmapDrawable(getResources(),b);
d.setBounds(0,0,d.getIntrinsicWidth(),d.getIntrinsicHeight());
}
catch (Exception e)
{
System.out.println("Exc="+e);
}
return d;