2015-04-06 60 views
0

我正在创建更新配置文件页面,并从数据库中获取数据后,我想设置edittext中的值,以便我可以编辑它们。当我尝试它时,它给了我错误。请告诉我该怎么做。谢谢!SetText对于EditText

这是我ProfileActivity.java类

package com.example.fproject; 

import java.util.ArrayList; 
import java.util.List; 
import org.apache.http.NameValuePair; 
import org.apache.http.message.BasicNameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class ProfileActivity extends Activity { 

EditText firstnameBox, lastnameBox, departmentBox, officeBox, emailBox, phonenoBox, passwordBox, statusBox, confirm_passwordBox; 
private Button register; 
JSONParser jsonParser = new JSONParser(); 
private static final String TAG_SUCCESS = "success"; 
private ProgressDialog pDialog; 
String user; 
SessionManagement session; 
GetIPAddress getIPaddress = new GetIPAddress(); 
private static String url_get_user_data; // products JSONArray 
JSONArray data = null; 


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

    session = new SessionManagement(getApplicationContext()); 
    SharedPreferences sp = getSharedPreferences("login_pref", 0); 
    user = sp.getString(session.KEY_EMAIL, null); 

    url_get_user_data = getIPaddress.getIP()+"get_user_data_for_profile.php"; 

    firstnameBox = (EditText)findViewById(R.id.update_firstname); 
    lastnameBox = (EditText)findViewById(R.id.update_lastname); 
    departmentBox = (EditText)findViewById(R.id.update_department); 
    officeBox = (EditText)findViewById(R.id.update_office); 
    emailBox = (EditText)findViewById(R.id.update_email); 
    phonenoBox = (EditText)findViewById(R.id.update_phoneno); 
    passwordBox = (EditText)findViewById(R.id.update_password); 
    confirm_passwordBox = (EditText)findViewById(R.id.update_confirm_password); 
    new GetUserData().execute(); 
    register = (Button)findViewById(R.id.update_register); 
    register.setOnClickListener(new OnClickListener() { 

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

     } 

    }); 

    } 

class GetUserData extends AsyncTask<String, String, String>{ 

    @Override 
    protected String doInBackground(String... arg0) { 
     // Building Parameters 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     params.add(new BasicNameValuePair("email", user)); 
     // getting JSON string from URL 
     JSONObject json = jsonParser.makeHttpRequest(url_get_user_data, "GET", params); 

     // Check your log cat for JSON reponse 
     Log.d("User Data: ", json.toString()); 

     try { 
      // Checking for SUCCESS TAGh 
      int success = json.getInt(TAG_SUCCESS); 

       if (success == 1) { 
        // successfully received product details 
        JSONArray userObj = json 
          .getJSONArray("data"); // JSON Array 

        // get first product object from JSON Array 
        JSONObject user = userObj.getJSONObject(0);    


        //firstnameBox.setText(user.getString("firstname")); 
        firstnameBox.setText("lsdf;skdjf", TextView.BufferType.EDITABLE); 
        /*lastnameBox.setText(user.getString("lastname")); 
        departmentBox.setText(user.getString("department")); 
        officeBox.setText(user.getString("office")); 
        emailBox.setText(user.getString("email")); 
        phonenoBox.setText(user.getString("phoneno")); 
        passwordBox.setText(user.getString("password")); 
        statusBox.setText(user.getString("status")); 
*/ 

      } else { 
       // no products found 
       // Launch Add New product Activity 
       Intent i = new Intent(getApplicationContext(), 
         AdminHomeActivity.class); 
       // Closing all previous activities 
       i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       startActivity(i); 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    }} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.profile, menu); 
    return true; 
} 

}

这是logcat的错误

04-06 22:31:25.725: E/AndroidRuntime(644): FATAL EXCEPTION: AsyncTask #1 
04-06 22:31:25.725: E/AndroidRuntime(644): java.lang.RuntimeException: An error occured while executing doInBackground() 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.os.AsyncTask$3.done(AsyncTask.java:266) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1081) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:574) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at java.lang.Thread.run(Thread.java:1020) 
04-06 22:31:25.725: E/AndroidRuntime(644): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.view.ViewRoot.checkThread(ViewRoot.java:3392) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.view.ViewRoot.invalidateChild(ViewRoot.java:597) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:645) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.view.ViewGroup.invalidateChild(ViewGroup.java:3691) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.view.View.invalidate(View.java:7141) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.widget.TextView.invalidateCursor(TextView.java:3866) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.widget.TextView.spanChange(TextView.java:6932) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.widget.TextView$ChangeWatcher.onSpanAdded(TextView.java:7058) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.text.SpannableStringBuilder.sendSpanAdded(SpannableStringBuilder.java:918) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:615) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:518) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.text.Selection.setSelection(Selection.java:74) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.text.Selection.setSelection(Selection.java:85) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.text.method.ArrowKeyMovementMethod.initialize(ArrowKeyMovementMethod.java:288) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.widget.TextView.setText(TextView.java:2814) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.widget.TextView.setText(TextView.java:2691) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.widget.EditText.setText(EditText.java:78) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at com.example.fproject.ProfileActivity$GetUserData.doInBackground(ProfileActivity.java:100) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at com.example.fproject.ProfileActivity$GetUserData.doInBackground(ProfileActivity.java:1) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at android.os.AsyncTask$2.call(AsyncTask.java:252) 
04-06 22:31:25.725: E/AndroidRuntime(644):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
04-06 22:31:25.725: E/AndroidRuntime(644):  ... 4 more 

谢谢!..请咨询我就做什么

+0

您试图UI从后台线程改变。 –

+0

是的,我试图从后台线程更改UI。 –

+0

你不应该这样做:) –

回答

0

您正试图改变从的AsyncTask的doInBackground(您的UI),但运行在后台线程,而不是主线程(或UI线程)。这就是onPostExecute()的用途,因为AsyncTask在doInBackground完成后立即在UI线程上运行。

我的建议:

  1. 更改为JSONObject的结果类型您的AsyncTask类:

    class GetUserData extends AsyncTask<String, String, JSONObject> {

  2. 更改返回类型doInBackground()来的JSONObject:

    protected JSONObject doInBackground(String... arg0) {

  3. 退运的JSONObject对象user,并删除所有你注释掉UI相关的代码,也行100

    JSONObject user = userObj.getJSONObject(0); return user;

  4. 把UI相关的代码在一个新的方法onPostExecute()

`@Override protected void onPostExecute(JSONObject user){ if(user == null){ return; //做什么 }

try { 
    firstnameBox.setText(user.getString("firstname")); 
    lastnameBox.setText(user.getString("lastname")); 
    departmentBox.setText(user.getString("department")); 
    officeBox.setText(user.getString("office")); 
    emailBox.setText(user.getString("email")); 
    phonenoBox.setText(user.getString("phoneno")); 
    passwordBox.setText(user.getString("password")); 
    statusBox.setText(user.getString("status")); 
} catch(JSONException e) { 
    // process your exception 
} 

} `

0

您正试图从不允许的后台线程中更改UI。您应该覆盖onPostExecute for AsyncTask并使用它来更新您的UI。您的AsyncTask应该是这样的:

class GetUserData extends AsyncTask<String, String, JSONObject> { 

     @Override 
     protected JSONObject doInBackground(String... arg0) { 
       //Code to get user 
       return user; 
     } 

     @Override 
     protected void onPostExecute(JSONObject user) { 
      try { 
       firstnameBox.setText(user.getString("firstname")); 
      } catch (Exception e) {} 

     } 
    } 
+0

我做到了这一点,它仍然给我一个JavaNullPointerException错误 –

+0

你能告诉我错误发生的地方 –

+0

我不能发布图像,但这就是它.... 04-07 00:43:49.825:E/AndroidRuntime(809):致命例外:main 04-07 00:43:49.825:E/AndroidRuntime(809):java.lang .NullPointerException 04-07 00:43:49.825:E/AndroidRuntime(809):\t at com.example.fproject。ProfileActivity $ GetUserData.onPostExecute(ProfileActivity.java:122) 04-07 00:43:49.825:E/AndroidRuntime(809):\t at com.example.fproject.ProfileActivity $ GetUserData.onPostExecute(ProfileActivity.java:1) 04-07 00:43:49.825:E/AndroidRuntime(809):\t at android.os.AsyncTask.finish(AsyncTask.java:590) 04-07 00:43:49.825:E/AndroidRuntime(809):\t在 –

相关问题