0

私はEclipseでAndroidアプリを作成することを自分自身に教えようとしています。私のプロジェクトは、tumblrアカウントの写真を表示するアプリを作成することです。

Twitter用の同様のアプリから既存のコードを見つけました。

tumblr用のアプリを実行できると思った方法でコードを変更しようとしました。何が問題で、なぜエミュレータがクラッシュし続けるのかを理解するために何時間も費やした後、私はここでいくつかの助けを見つけたいと思っています。

私のコードは次のようになります。

パッケージcom.example.example;

パブリッククラスの例はActivity{を拡張します

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ArrayList<Tweet> tweets = getTweets("my api key");

    ListView listView = (ListView) findViewById(R.id.ListViewId);
    listView.setAdapter(new UserItemAdapter(this, R.layout.listitem, tweets));
}

public class UserItemAdapter extends ArrayAdapter<Tweet> {
    private ArrayList<Tweet> tweets;

    public UserItemAdapter(Context context, int imageViewResourceId,
            ArrayList<Tweet> tweets) {
        super(context, imageViewResourceId, tweets);
        this.tweets = tweets;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;
        if (v == null) {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.listitem, null);
        }

        Tweet tweet = tweets.get(position);
        if (tweet != null) {

            ImageView image = (ImageView) v.findViewById(R.id.avatar);

            if (image != null) {
                image.setImageBitmap(getBitmap(tweet.image_url));
            }
        }
        return v;
    }
}

public Bitmap getBitmap(String bitmapUrl) {
    try {
        URL url = new URL(bitmapUrl);
        return BitmapFactory.decodeStream(url.openConnection()
                .getInputStream());
    } catch (Exception ex) {
        return null;
    }
}

public ArrayList<Tweet> getTweets(String key) {
    String searchUrl = "http://api.tumblr.com/v2/blog/www.richkidsofinstagram.tumblr.com/posts?api_key="
            + key;

    ArrayList<Tweet> tweets = new ArrayList<Tweet>();

    HttpClient client = new DefaultHttpClient();
    HttpGet get = new HttpGet(searchUrl);

    ResponseHandler<String> responseHandler = new BasicResponseHandler();

    String responseBody = null;
    try {
        responseBody = client.execute(get, responseHandler);
    } catch (Exception ex) {
        ex.printStackTrace();
    }

    JSONObject jsonObject = null;
    JSONParser parser = new JSONParser();

    try {
        Object obj = parser.parse(responseBody);
        jsonObject = (JSONObject) obj;

    } catch (Exception ex) {
        Log.v("TEST", "Exception: " + ex.getMessage());
    }

    JSONArray arr = null;

    try {
        Object j = jsonObject.get("results");
        arr = (JSONArray) j;
    } catch (Exception ex) {
        Log.v("TEST", "Exception: " + ex.getMessage());
    }

    for (Object t : arr) {
        Tweet tweet = new Tweet(((JSONObject) t).get("photos").toString());
        tweets.add(tweet);
    }

    return tweets;
}

public class Tweet {

    public String image_url;

    public Tweet(String url) {

        this.image_url = url;
    }
}

}

ログイン日食は私にこれらのエラーを与えます

08-30 15:58:34.549: D/dalvikvm(330): GC_FOR_MALLOC freed 1827 objects / 187744 bytes in 60ms
08-30 15:58:34.879: D/dalvikvm(330): GC_FOR_MALLOC freed 9343 objects / 277800 bytes in 60ms
08-30 15:58:34.969: D/AndroidRuntime(330): Shutting down VM
08-30 15:58:34.969: W/dalvikvm(330): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
08-30 15:58:34.989: E/AndroidRuntime(330): FATAL EXCEPTION: main
08-30 15:58:34.989: E/AndroidRuntime(330): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.example/com.example.example.Example}: java.lang.NullPointerException
08-30 15:58:34.989: E/AndroidRuntime(330):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
08-30 15:58:34.989: E/AndroidRuntime(330):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-30 15:58:34.989: E/AndroidRuntime(330):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-30 15:58:34.989: E/AndroidRuntime(330):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-30 15:58:34.989: E/AndroidRuntime(330):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-30 15:58:34.989: E/AndroidRuntime(330):  at android.os.Looper.loop(Looper.java:123)
08-30 15:58:34.989: E/AndroidRuntime(330):  at android.app.ActivityThread.main(ActivityThread.java:4627)
08-30 15:58:34.989: E/AndroidRuntime(330):  at java.lang.reflect.Method.invokeNative(Native Method)
08-30 15:58:34.989: E/AndroidRuntime(330):  at java.lang.reflect.Method.invoke(Method.java:521)
08-30 15:58:34.989: E/AndroidRuntime(330):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-30 15:58:34.989: E/AndroidRuntime(330):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-30 15:58:34.989: E/AndroidRuntime(330):  at dalvik.system.NativeStart.main(Native Method)
08-30 15:58:34.989: E/AndroidRuntime(330): Caused by: java.lang.NullPointerException
08-30 15:58:34.989: E/AndroidRuntime(330):  at com.example.example.Example.getTweets(Example.java:119)
08-30 15:58:34.989: E/AndroidRuntime(330):  at com.example.example.Example.onCreate(Example.java:35)
08-30 15:58:34.989: E/AndroidRuntime(330):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-30 15:58:34.989: E/AndroidRuntime(330):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-30 15:58:34.989: E/AndroidRuntime(330):  ... 11 more

問題を見つけることができる人はいますか?どんな助けでも非常に高く評価されています!

4

1 に答える 1

0

getTweets行番号なしではわかりにくいですが、代わりにこれを試してください:

for ( int i=0 ; i<arr.length() ; i++ ) {
    Tweet tweet = new Tweet( arr.getJSONObject( i ).getString( "photos" ) );
    tweets.add( tweet );
}

また、その周りにいくつかの例外処理が必要になります


JSONArrayの未定義のメソッドに関連します。

jsonArrayを作成しているコードを編集してみてください。

try {
    arr = jsonObject.getJSONArray("results");
} catch (Exception ex) {
    Log.v("TEST", "Exception: " + ex.getMessage());
}

一般的な方法ではなく、可能な場合は特定の方法を使用してみてくださいget()

これがエラーに役立つかどうかはわかりませんが、コードを少しきれいに保つのに役立ちます。

アップデート

元のコードはJSONSimple用だったようです。

AndroidにはJSON解析が付属しているため、特定のものが必要でない限り、これを使用してもあまり意味がありません。

Androidのデフォルトを使用して解析するには:

import org.json.JSONObject;
import org.json.JSONArray;

-

JSONObject jsonObject = new JSONObject(responseBody);

既存のJSONParserコードを削除します。

于 2012-08-30T16:47:54.413 に答える