2013-06-22 23 views
0

我有問題可以在我的聊天中顯示朋友的姓名。每次運行時都會關閉應用程序以顯示朋友的姓名。如果我評論該部分的朋友的名字,消息可以顯示正常。但是當我爲名稱添加標籤時,會出現錯誤並強制關閉。我真的需要幫助,任何人都請幫助我。謝謝無法在聊天中顯示朋友的姓名

JSON部分

if(!content.equals("null")){ 
         try{ 
          JSONArray jArr = new JSONArray(content); 

          // String messages=""; 
           for(int i=0; i < jArr.length() ; i++){ 
            JSONObject jObj = jArr.getJSONObject(i); 

            String name = jObj.getString("firstname"); 
            String message = jObj.getString("message"); 

            friendLabel.setText(name); 
            showMessage(message, false); 
           } 
         }catch(JSONException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
        else{ 
         Toast.makeText(ChatRoom.this, "Error", Toast.LENGTH_LONG).show(); 
        } 

整個代碼

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

     messagesContainer = (ViewGroup) findViewById(R.id.messagesContainer); 
     scrollContainer = (ScrollView) findViewById(R.id.scrollContainer); 

     Button sendMessageButton = (Button) findViewById(R.id.sendButton); 

     Bundle bundle = this.getIntent().getExtras(); 
     /*final String paramnama = bundle.getString("nama");*/ 
     messageText = (EditText) findViewById(R.id.messageEdit); 
     meLabel = (TextView) findViewById(R.id.meLabel); 
     friendLabel = (TextView) findViewById(R.id.friendLabel); 
     meLabel.setText("me"); 


     final String param1 = bundle.getString("keyCourseId"); 
     final String param2 = bundle.getString("keyUserId"); 
     final String param3 = bundle.getString("keyChatsId"); 
     String param4 = bundle.getString("keyMessagesId"); 


     sendMessageButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       //for send part already works fine 
     }); 

     HttpURLConnection connection; 
     URL url = null; 
     try{ 
      linkurl = new Koneksi(this); 
      SERVER_URL = linkurl.getUrl(); 
      SERVER_URL += "/mobile/ChatRoom.php?idu="+param2+"&idch="+param3; 
      url = new URL(SERVER_URL); 
      connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoOutput(true); 
      connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      connection.setRequestMethod("POST"); 
      new ReceivedTask().execute(); 

      } 
     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

      } 


    public class ReceivedTask extends AsyncTask<String, String, String> { 

     @Override 
     protected void onPreExecute() { 

     } 

     @Override 
     protected String doInBackground(String... arg0) { 
      // TODO Auto-generated method stub 
      try{ 
       HttpClient httpClient = new DefaultHttpClient(); 
       HttpPost httpPost = new HttpPost(SERVER_URL); 
       ArrayList<NameValuePair> param = new ArrayList<NameValuePair>(); 
       //add parameter 
        httpPost.setEntity(new UrlEncodedFormEntity(param)); 

        HttpResponse httpRespose = httpClient.execute(httpPost); 
        HttpEntity httpEntity = httpRespose.getEntity(); 

        //read content 
        InputStream in = httpEntity.getContent(); 
        BufferedReader read = new BufferedReader(new InputStreamReader(in)); 

        String content = ""; 
        String line = ""; 


        while((line = read.readLine())!=null){ 
         content += line; 
        } 
        Log.d("ADBUG", "content: "+content); 

        //json 
        if(!content.equals("null")){ 
         try{ 
          JSONArray jArr = new JSONArray(content); 

          // String messages=""; 
           for(int i=0; i < jArr.length() ; i++){ 
            JSONObject jObj = jArr.getJSONObject(i); 


            String message = jObj.getString("message"); 


            showMessage(message, false); 
           } 
         }catch(JSONException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
        else{ 
         Toast.makeText(ChatRoom.this, "Error", Toast.LENGTH_LONG).show(); 
        } 
      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace();} 
      catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 



      return null; 

       } 
     } 



    public void showMessage(String message, boolean leftSide) { 
     final TextView textView = new TextView(ChatRoom.this); 
     textView.setTextColor(Color.BLACK); 
     textView.setText(message); 

     int bgRes = R.drawable.left_message_bg; 

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 

     if (!leftSide) { 
      bgRes = R.drawable.right_message_bg; 
      params.gravity = Gravity.RIGHT; 
     } 

     textView.setLayoutParams(params); 

     textView.setBackgroundResource(bgRes); 

     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       messagesContainer.addView(textView); 

       // Scroll to bottom 
       if (scrollContainer.getChildAt(0) != null) { 
        scrollContainer.scrollTo(scrollContainer.getScrollX(), scrollContainer.getChildAt(0).getHeight()); 
       } 
       scrollContainer.fullScroll(View.FOCUS_DOWN); 
      } 
     }); 
    } 

logcat的

06-22 17:16:06.688: D/ADBUG(698): content: [{"firstname":"teach","message":"test"},{"firstname":"teach","message":"test"},{"firstname":"teach","message":"test"},{"firstname":"teach","message":"testing chat"}, 
06-22 17:16:06.787: W/dalvikvm(698): threadid=11: thread exiting with uncaught exception (group=0x40015560) 
06-22 17:16:06.797: E/AndroidRuntime(698): FATAL EXCEPTION: AsyncTask #2 
06-22 17:16:06.797: E/AndroidRuntime(698): java.lang.RuntimeException: An error occured while executing doInBackground() 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.os.AsyncTask$3.done(AsyncTask.java:200) 
06-22 17:16:06.797: E/AndroidRuntime(698): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
06-22 17:16:06.797: E/AndroidRuntime(698): at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
06-22 17:16:06.797: E/AndroidRuntime(698): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
06-22 17:16:06.797: E/AndroidRuntime(698): at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
06-22 17:16:06.797: E/AndroidRuntime(698): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
06-22 17:16:06.797: E/AndroidRuntime(698): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
06-22 17:16:06.797: E/AndroidRuntime(698): at java.lang.Thread.run(Thread.java:1019) 
06-22 17:16:06.797: E/AndroidRuntime(698): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.view.ViewRoot.checkThread(ViewRoot.java:2932) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.view.ViewRoot.requestLayout(ViewRoot.java:629) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.view.View.requestLayout(View.java:8267) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.view.View.requestLayout(View.java:8267) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.view.View.requestLayout(View.java:8267) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.view.View.requestLayout(View.java:8267) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.view.View.requestLayout(View.java:8267) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.widget.ScrollView.requestLayout(ScrollView.java:1291) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.view.View.requestLayout(View.java:8267) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.view.View.requestLayout(View.java:8267) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.widget.TextView.checkForRelayout(TextView.java:5521) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.widget.TextView.setText(TextView.java:2724) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.widget.TextView.setText(TextView.java:2592) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.widget.TextView.setText(TextView.java:2567) 
06-22 17:16:06.797: E/AndroidRuntime(698): at mobile.chat.ChatRoom$ReceivedTask.doInBackground(ChatRoom.java:199) 
06-22 17:16:06.797: E/AndroidRuntime(698): at mobile.chat.ChatRoom$ReceivedTask.doInBackground(ChatRoom.java:1) 
06-22 17:16:06.797: E/AndroidRuntime(698): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
06-22 17:16:06.797: E/AndroidRuntime(698): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
06-22 17:16:06.797: E/AndroidRuntime(698): ... 4 more 
+0

你已經找到一個解決方案? – Bigflow

+0

@Bigflow,非常感謝您的回覆。是的,我已經找到了它,我必須讓人名變得動態。 :) – blackneko

+0

如果你有問題的答案,你也可以自己回答並接受它。它可以隨時幫助其他人如何修復它:) – Bigflow

回答

1

使人名稱變爲動態

public void showPerson(String friendname, boolean leftSide) { 
     final TextView textView = new TextView(ChatRoom.this); 
     textView.setTextColor(Color.BLACK); 
     textView.setTextSize(12); 
     textView.setText(friendname); 

     int bgName = R.id.meLabel; 

     LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
       LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); 

     if (!leftSide) { 
      bgName = R.id.friendLabel; 
      params.gravity = Gravity.RIGHT; 
     } 

     textView.setLayoutParams(params); 

     textView.setId(bgName); 

     runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       messagesContainer.addView(textView); 

       // Scroll to bottom 
       if (scrollContainer.getChildAt(0) != null) { 
        scrollContainer.scrollTo(scrollContainer.getScrollX(), scrollContainer.getChildAt(0).getHeight()); 
       } 
       scrollContainer.fullScroll(View.FOCUS_DOWN); 
      } 
     }); 
    } 

所以JSON部分變成了這個樣子

    if(!content.equals("null")){ 
         try{ 
          JSONArray jArr = new JSONArray(content); 

          // String messages=""; 
           for(int i=0; i < jArr.length() ; i++){ 
            JSONObject jObj = jArr.getJSONObject(i); 

            String name = jObj.getString("firstname"); 
            String message = jObj.getString("message"); 

            showPerson(name, false); 
            showMessage(message, false); 
           } 
         }catch(JSONException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
0

你所有的setText,麪包等..行動應在UI線程中完成。

舉例來說,這樣的東西:friendLabel.setText(name);

爲了解決這個問題,我建議你做的是,onPostExecute內:

@Override 
    protected void onPostExecute(JSONArray result) { 
     updateUI();// Do whatever you want here 
    } 

來源:http://developer.android.com/reference/android/os/AsyncTask.html

onPostExecute(結果)在計算完成後在UI線程上調用。後臺計算的結果是 作爲參數傳遞給此步驟。

+0

Waza_Be,它是這樣的postexecute內部'如果(結果== NULL) \t \t { \t \t \t \t Toast.makeText(ChatRoom.this, 「錯誤」,Toast.LENGTH_LONG).show(); \t \t} \t \t否則{ \t \t \t friendLabel.setText(名稱); showMessage(message,false); \t \t}'或者是錯的?非常感謝 – blackneko

+0

如果我把那個名字和消息初始化,我的聊天室裏就不會出現任何東西,結果只會出現在logcat中。 O.o – blackneko

+0

我很肯定你錯過了一些東西,我在許多不同的應用程序中有這個代碼,這工作正常。檢查您的字段和一些空值 –

相關問題