활동을 대화 상자로 사용합니다 (문제는 생각하지 않지만 언급합니다).onClick 및 AsyncTask 치명적인 예외 # 1
Dialog가 사용자로부터 일부 데이터를 가져온 다음 Apache's HttpClient
을 사용하여 해당 데이터를 웹 서비스에 보냅니다. 즉, 해당 Button과 연결된 onClick() 메서드와 Button이 있습니다. onClick()
이 발생하면 사용자가 추가 한 데이터를 얻고이를 JSON으로 보내는 메서드 (sendJSON)에 전달합니다.
그럼 스레드에 대한 코드를 추가했습니다. AsyncTask를 매개 변수로 사용하여 데이터를 전달하고 doInBackground
내 sendJSON 메서드를 호출하고 이제는 onClick 내에서 사용자 데이터를 매개 변수로 사용하여 execute()
을 호출하기 만하면됩니다.
Google에서 검색 한 내용에서 내 활동에 대한 호출을하므로 sendJSON
메서드를 호출 할 수 있습니다. 그리고는 이것이다 :
Do not access the Android UI toolkit from outside the UI thread
그래서 나는 두 가지 질문을 얻었다. 이 문제의 신속한 해결 방법은 무엇입니까? onClick() 메서드 내부에
runOnUiThread
이 작업을 수행합니까? 그리고 두 번째로 내 논리가 처음부터 잘못 되었습니까? 필자가 필요로하는 메서드를 작성한 다음 스레드에 대한 코드를 추가했습니다. 그래서 내가 처음부터 어떻게 생각 했어야 했습니까?
코드를 작성하고 잘못된 것을 이해하기 위해 검색하는 데 많은 시간이 걸렸으므로 그로부터 배워야 할 내용을 알고 싶습니다. 동일한 오류를 다시 반복하지 마십시오.
감사합니다
편집 : 코드
온 클릭 :
@Override
public void onClick(View v) {
if(v == send) {
//Mocking data
String network="anetwork", password , comment;
String lat="1", longt="2";
EditText passwd = (EditText)findViewById(R.id.password);
password = passwd.getText().toString();
EditText com = (EditText)findViewById(R.id.comment);
comment = com.getText().toString();
LongSend ls = new LongSend();
ls.execute(lat,longt,network,password,comment);
}
}
AsyncTask를 :
public class LongSend extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params){
Log.i("AsyncTask", "here 1");
int param1 = Integer.parseInt(params[0]);
int param2 = Integer.parseInt(params[1]);
DialogActivity da = new DialogActivity();
try {
da.sendJson(param1, param2, params[2], params[3], params[4]);
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(Void nothing) {
//
}
}
sendJSON
public void sendJson(int lat, int longt, String network, String passwd, String comment) throws JSONException {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("web_service_here");
HttpResponse response;
JSONObject json = new JSONObject();
JSONObject nested = new JSONObject();
try {
Log.i("SENDJSON", " print");
nested.put("lat", lat);
nested.put("longt", longt);
json.put("coord", nested); //add "nested" to "json"
json.put("network", network);
json.put("password", passwd);
json.put("comment", comment);
StringEntity se = new StringEntity(json.toString());
se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
httppost.getParams().setParameter("json", json);
Log.v("sendJSON", "json== " +json);
httppost.setEntity(se);
Log.v("sendJSON", "SE== " +se);
response = httpclient.execute(httppost);
if(response !=null) {
str = inputStreamToString(response.getEntity().getContent()).toString();
Log.i("POST", "send JSON data");
Log.i("DATA", "Data Send==" +str);
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
활동
public class DialogActivity extends Activity implements OnClickListener {
public static String str;
Button send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_fragment);
send = (Button)findViewById(R.id.button_send);
send.setOnClickListener(this);
}
로그 캣 :
06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) FATAL EXCEPTION : AsyncTask를
1 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397)는 java.lang.RuntimeException가 :
doInBackground()를
실행 중 오류가 발생 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) android.os.AsyncTask $ 3.done에서 (AsyncTask를. java : 266) 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : 에서 java.util.concurrent.FutureTask $ Sync.innerSetException (FutureTask.java:273) 06-08 05:33:59 .801 : E/AndroidRuntime (397) : at java.util.concurrent.FutureTask.setException (FutureTask.java:124) 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : java.util. 동시. FutureTask $ Sync.innerRun (FutureTask.java:307) 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : java.util.concurrent.FutureTask.run (FutureTask.java:137) 06 -08 05 : 33 : 59.801 : E/AndroidRuntime (397) : 에서 java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1081) 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : 에서 java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:574) 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : 에서 java.lang.Thread.run (Thread. 자바 : 1020) 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : 원인 : java.lang.RuntimeException : Looper.prepare()를 호출하지 않은 스레드에서 핸들러를 만들 수 없음 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : android.os.Handler. (Handler.java:121) 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : android.app.Activity (Activity.java:727) 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : 에서 org.teo.wifit.DialogActivity. (DialogActivity.java:30) 06-08 05:33 : 59.801 : E/AndroidRuntime (397) : at org.teo.wifit.DialogActivity $ LongSend.doInBackground (DialogActivity.java:88) 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : org. teo.wifit.Dialog 활동 $ LongSend.doInBackground (DialogActivity.java:1) 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : android.os.AsyncTask $ 2.call (AsyncTask.java:252) 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : 에서 java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:305) 06-08 05 : 33 : 59.801 : E/AndroidRuntime (397) : ... 4 문제는
라인 (88) 더 여기서 DialogActivity da = new DialogActivity();
코드를 입력하십시오. – amrinder007
@ amrinder007 코드 및 Logcat 추가 – mt0s
@Raghunandan 완료. – mt0s