2013-04-26 116 views
2

我想获得的图像从URL和文本数据,但它关闭应用程序Forcefully.What是它的问题..加载图像从URL中的Android

public class BandMembers extends ListActivity { 
public static final String TAG_MEMBER_NAME = "member_name"; 
public static final String TAG_MEMBER_SKILL = "member_skill"; 
public static final String TAG_THUMB_MEMBER_IMAGE = "member_thumb_image"; 
public static String URL = "http://...../.../..../mainAPI.php"; 

ArrayList<HashMap<String, String>> memberList; 
String responseData = null; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.band_members); 

    memberList = new ArrayList<HashMap<String,String>>(); 
    new AsyncData().execute(); 
} 

class AsyncData extends AsyncTask<String, Void, Void> { 
    ProgressDialog pDialog; 

    @Override 
    protected void onPreExecute() { 
     pDialog = new ProgressDialog(BandMembers.this); 
     pDialog.setTitle("Loading...."); 
     pDialog.setMessage("Please wait..."); 
     pDialog.show(); 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(String... args) { 
     // TODO Auto-generated method stub 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(URL); 
     try { 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
      nameValuePairs.add(new BasicNameValuePair("rquest","{\"method\":\"band_members\",\"body\":[{}]}")); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8)); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity resEntity = response.getEntity(); 
      responseData = EntityUtils.toString(resEntity); 
      try { 
       JSONArray data = new JSONArray(responseData); 
       for (int i = 0; i < data.length(); i++) { 
        HashMap<String, String> map = new HashMap<String, String>(); 
        JSONObject c = data.getJSONObject(i); 
        String memberName = c.getString(TAG_MEMBER_NAME); 
        String memberSkill = c.getString(TAG_MEMBER_SKILL); 
        String memberImage = c.getString(TAG_THUMB_MEMBER_IMAGE); 
        map.put(TAG_MEMBER_NAME, memberName); 
        map.put(TAG_MEMBER_SKILL, memberSkill); 
        map.put(TAG_THUMB_MEMBER_IMAGE, memberImage); 
        memberList.add(map); 
       } 

      } catch (JSONException e) { 
       // TODO: handle exception 
       e.printStackTrace(); 
      } 
     } catch (ClientProtocolException e) { 
      Toast.makeText(BandMembers.this, "There was an issue Try again later", Toast.LENGTH_LONG).show(); 
     } catch (IOException e) { 
      Toast.makeText(BandMembers.this, "There was an IO issue Try again later", Toast.LENGTH_LONG).show(); 
     } 
     return null; 
    } 


    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     if (pDialog != null && pDialog.isShowing()) { 
      pDialog.dismiss(); 
     } 


     setListAdapter(new BandAdapter(BandMembers.this,R.layout.band_member_row_file, memberList)); 

    } 
} 
} 

类带适配器

public class BandAdapter extends ArrayAdapter<HashMap<String, String>>{ 
Context context; 
ArrayList<HashMap<String, String>> myList; 
HashMap<String, String> myData; 
int layout; 
public BandAdapter(Context context, int textViewResourceId, List<HashMap<String, String>> objects) { 
    super(context, textViewResourceId, objects); 
    // TODO Auto-generated constructor stub 
    this.context = context; 
    this.myList = (ArrayList<HashMap<String, String>>) objects; 
    this.layout = textViewResourceId; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View row = null; 
    TextView name, info; 
    ImageView image; 
    LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
    row = inflater.inflate(layout, parent, false); 
    name = (TextView)row.findViewById(R.id.textMemberName); 
    info = (TextView)row.findViewById(R.id.textMemberInfo); 
    myData = myList.get(position); 
    try{ 
     image = (ImageView)row.findViewById(R.id.imageMember); 
     name.setText("" + myData.get(BandMembers.TAG_MEMBER_NAME)); 
     info.setText("" + myData.get(BandMembers.TAG_MEMBER_SKILL)); 
     Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL ("" + myData.get(BandMembers.TAG_THUMB_MEMBER_IMAGE)).getContent()); 
     image.setImageBitmap(bitmap); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return row; 
} 
} 

和我的logcat是..

04-26 12:01:15.574: E/AndroidRuntime(2575): FATAL EXCEPTION: main 
04-26 12:01:15.574: E/AndroidRuntime(2575): android.os.NetworkOnMainThreadException 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at java.net.InetAddress.getAllByName(InetAddress.java:220) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:303) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at java.net.URLConnection.getContent(URLConnection.java:194) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at java.net.URL.getContent(URL.java:447) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at com.bandapp.BandAdapter.getView(BandAdapter.java:51) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.AbsListView.obtainView(AbsListView.java:2033) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.ListView.measureHeightOfChildren(ListView.java:1244) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.ListView.onMeasure(ListView.java:1155) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.View.measure(View.java:12603) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.RelativeLayout.measureChild(RelativeLayout.java:579) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:392) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.View.measure(View.java:12603) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.View.measure(View.java:12603) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:660) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.View.measure(View.java:12603) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2072) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.View.measure(View.java:12603) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.View.measure(View.java:12603) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:594) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:376) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.View.measure(View.java:12603) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.View.measure(View.java:12603) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.View.measure(View.java:12603) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:660) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.View.measure(View.java:12603) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4677) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2072) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.View.measure(View.java:12603) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1044) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.os.Looper.loop(Looper.java:137) 
04-26 12:01:15.574: E/AndroidRuntime(2575):  at android.app.ActivityThread.main(ActivityT 

请帮助我,给与代码中的一些解决方案,提前谢谢你..

回答

2

只是改变BandAdapter类与此一..

public class BandAdapter extends ArrayAdapter<HashMap<String, String>> { 
Context context; 
ArrayList<HashMap<String, String>> myList; 
HashMap<String, String> myData; 
int layout; 

public BandAdapter(Context context, int textViewResourceId, List<HashMap<String, String>> objects) { 
    super(context, textViewResourceId, objects); 
    // TODO Auto-generated constructor stub 
    this.context = context; 
    this.myList = (ArrayList<HashMap<String, String>>) objects; 
    this.layout = textViewResourceId; 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View row = null; 
    TextView name, info; 
    ImageView image; 
    Bitmap bimage; 

    LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
    row = inflater.inflate(layout, parent, false); 
    name = (TextView)row.findViewById(R.id.textMemberName); 
    info = (TextView)row.findViewById(R.id.textMemberInfo); 
    myData = myList.get(position); 
    try{ 
     image = (ImageView)row.findViewById(R.id.imageMember); 
     name.setText("" + myData.get(BandMembers.TAG_MEMBER_NAME)); 
     info.setText("" + myData.get(BandMembers.TAG_MEMBER_SKILL)); 
     String uri = ("" + myData.get(BandMembers.TAG_THUMB_MEMBER_IMAGE).replace(" ", "%20")); 
     bimage= getBitmapFromURL(uri); 
     image.setImageBitmap(bimage); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return row; 
} 
public static Bitmap getBitmapFromURL(String src) { 
    try { 
     URL url = new URL(src); 
     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

非常感谢。 – RBL 2013-04-29 07:47:21

0

你可以使用Android查询库来延迟加载你的图片,它非常简单直接,你只需要指定图片的url,并且这个库为你做所有的缓存和图片下载 而且你的例外的是在主线程异常的网络,你不应该干什么在doInBackground方法 任何UI相关的改变,例如加载图像的代码只是一行

//fetch and set the image from internet, cache with file and memory 
aq.id(R.id.image1).image("http://www.vikispot.com/z/images/vikispot/android-w.png"); 

您可以检查出aquery(https://code.google.com/p/android-query/

+0

我在类BandMember中使用AsyncTask,但未在用于绑定布局的BandAdapter类中使用。你能给我的代码解决方案吗? – RBL 2013-04-26 07:13:56

+0

现在检查我的答案 – 2013-04-26 07:14:42

0
 Toast.makeText(BandMembers.this, "There was an issue Try again later", Toast.LENGTH_LONG).show(); 

at frist Toast不能在doInBackground中使用。它是工作线程。您应该始终在UI线程中处理您的UI。

在同一时间,

Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL ("" + myData.get(BandMembers.TAG_THUMB_MEMBER_IMAGE)).getContent()); 

看来,这是从网络获取图像。它应该始终在工作线程中运行。除非你会得到android.os.NetworkOnMainThreadException。这就是为什么你会得到例外。

您可以创建Asyntask加载图像:

class ImageDownloadTask extends AsyncTask<Void, Integer, Bitmap> { 
     private ImageView mView; 
     ImageDownloadTask(ImageView view){ 
      mView = view; 
     } 
     @Override 
     protected Bitmap doInBackground(Void... params) { 
       Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL("" 
        + myData.get(BandMembers.TAG_THUMB_MEMBER_IMAGE)).getContent()); 
       return bitmap; 
     } 


     @Override 
     protected void onPostExecute(Bitmap result) { 
      mView.setImageBitmap(result); 
     } 
} 

然后新建一个SynckTask在getView方法加载图像

try{ 
     image = (ImageView)row.findViewById(R.id.imageMember); 
     name.setText("" + myData.get(BandMembers.TAG_MEMBER_NAME)); 
     info.setText("" + myData.get(BandMembers.TAG_MEMBER_SKILL)); 
     ImageDownloadTask task = new ImageDownloadTask(image); 
     task.execute(); 
    } 
+0

我该怎么做位图bitmap = BitmapFactory.decodeStream(((InputStream)new URL(“”+ myData.get(BandMembers.TAG_THUMB_MEMBER_IMAGE)).getContent()); – RBL 2013-04-26 07:21:25