问题
i've built a BaseAdapter extended class for my list view..
inside i have a TextView field which i want to set by code.
this field represent a facebook status of the user.
this field sometimes gets a text in hebrew, and then it crashes by stackoverflow error.
important to add that this ain't happened when the text the field gets is in english,
and when i've tried to debug it to find the problem, i've used setText with hebrew string inside an activity (not a BaseAdapter) and it worked fine.
this is my class:
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.WhosAround.R;
import com.WhosAround.AppVariables;
import com.WhosAround.Facebook.FacebookUser;
import com.facebook.android.AsyncFacebookRunner.RequestListener;
import com.facebook.android.FacebookError;
import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class FriendsFriendsTabList extends BaseAdapter {
private static LayoutInflater inflater = null;
private AppVariables app;
private final FacebookUser[] chatList;
public FriendsFriendsTabList(Activity activity) {
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
app = (AppVariables) activity.getApplicationContext();
chatList = app.makeApplicationFacebookUsersArray();
}
public int getCount() {
return chatList.length;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
View vi = convertView;
if (convertView == null)
vi = inflater.inflate(
R.layout.activity_friends_friends_tab_list_row, null);
if (position % 2 == 0)
vi.setBackgroundResource(R.color.list_background_light);
else
vi.setBackgroundResource(R.color.list_background_dark);
TextView name = (TextView) vi
.findViewById(R.id.list_friends_friends_tab_name);
TextView status = (TextView) vi
.findViewById(R.id.list_friends_friends_tab_status);
ImageView profilePicture = (ImageView) vi
.findViewById(R.id.list_profile_picture);
loadStatus(position, status);
return vi;
}
private void loadStatus(final int position, final TextView status) {
if (chatList[position].getStatus() != null)
status.setText(chatList[position].getStatus());
else {
final Handler handler = new Handler() {
@Override
public void handleMessage(Message message) {
try {
String currentStatus = (String) message.obj;
String utf8Status;
utf8Status = new String(currentStatus.getBytes(), "UTF-8");
chatList[position].setStatus(currentStatus);
Log.d("status", chatList[position].getStatus());
//this is the line that causes the error
status.setText(utf8Status);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
};
Thread thread = new Thread() {
@Override
public void run() {
String fqlQuery = "SELECT message FROM status WHERE uid="
+ Integer.toString(chatList[position].getId())
+ " LIMIT 1";
Bundle fqlQueryParams = new Bundle();
fqlQueryParams.putString("method", "fql.query");
fqlQueryParams.putString("query", fqlQuery);
app.getFacebookManager().getFacebookRunner().request(null, fqlQueryParams, new RequestListener() {
@Override
public void onMalformedURLException(MalformedURLException e, Object state) {
Log.e("Facebook User Status", e.toString());
}
@Override
public void onIOException(IOException e, Object state) {
Log.e("Facebook User Status", e.toString());
}
@Override
public void onFileNotFoundException(FileNotFoundException e, Object state) {
Log.e("Facebook User Status", e.toString());
}
@Override
public void onFacebookError(FacebookError e, Object state) {
Log.e("Facebook User Status", e.toString());
}
@Override
public void onComplete(String response, Object state) {
Log.d("Facebook Response", response);
JSONArray statusResults = app.convertToJSONArray(response);
try {
JSONObject statusObject = statusResults.getJSONObject(0);
String currentStatus = statusObject.getString("message");
Message message = handler.obtainMessage(1, currentStatus);
handler.sendMessage(message);
} catch (JSONException e) {
Log.e("Facebook User Status", e.toString());
}
}
});
}
};
thread.start();
}
}
}
i know the code is a bit mass, and that i should use asynctask instead of thread and handlers, but this is only a test, and i wanted to see if it works...
stacktrace:
06-20 19:30:15.180: E/AndroidRuntime(3863): FATAL EXCEPTION: main
06-20 19:30:15.180: E/AndroidRuntime(3863): java.lang.StackOverflowError
06-20 19:30:15.180: E/AndroidRuntime(3863): at com.ibm.icu4jni.util.LocaleData.get(LocaleData.java:96)
06-20 19:30:15.180: E/AndroidRuntime(3863): at java.util.Formatter.format(Formatter.java:1061)
06-20 19:30:15.180: E/AndroidRuntime(3863): at java.util.Formatter.format(Formatter.java:1031)
06-20 19:30:15.180: E/AndroidRuntime(3863): at java.lang.String.format(String.java:2183)
06-20 19:30:15.180: E/AndroidRuntime(3863): at java.lang.String.format(String.java:2157)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.text.Styled.drawDirectionalRun(Styled.java:266)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.text.Styled.drawText(Styled.java:362)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.text.Layout.drawText(Layout.java:1546)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.text.Layout.draw(Layout.java:380)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.widget.TextView.onDraw(TextView.java:4417)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.View.draw(View.java:6933)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.View.draw(View.java:6936)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.widget.AbsListView.dispatchDraw(AbsListView.java:1648)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.widget.ListView.dispatchDraw(ListView.java:3217)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.View.draw(View.java:6936)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.widget.AbsListView.draw(AbsListView.java:3030)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.View.draw(View.java:6936)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.widget.FrameLayout.draw(FrameLayout.java:357)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.View.draw(View.java:6936)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.widget.FrameLayout.draw(FrameLayout.java:357)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.View.draw(View.java:6936)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.widget.FrameLayout.draw(FrameLayout.java:357)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1644)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.View.draw(View.java:6936)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.widget.FrameLayout.draw(FrameLayout.java:357)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.drawChild(ViewGroup.java:1646)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1373)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.View.draw(View.java:6936)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.widget.FrameLayout.draw(FrameLayout.java:357)
06-20 19:30:15.180: E/AndroidRuntime(3863): at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1917)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewRoot.draw(ViewRoot.java:1530)
06-20 19:30:15.180: E/AndroidRuntime(3863): at android.view.ViewRoot.perfor
回答1:
Are you sure your
status.setText(utf8Status)
is running on the UI Thread? It may not be because of the Threaded Handler. You'll need to try running that as a POST. However, that usually results in a different error message.
Can you please point out which part of the code it line 96? The one causing the error?
来源:https://stackoverflow.com/questions/11123889/android-settext-with-hebrew-string-in-baseadapter-cause-stackoverflow