AsyncTask를 사용하여 성공적으로 내 서블릿 서버에 연결할 수 있지만 진행중인 네트워크 작업이 있음을 사용자에게 알려주는 진행 대화 상자를 갖고 싶습니다. (2G 및 때로는 3G를 사용하여 결과를 가져 오는 데 지연이 발생할 수 있음). 내가 생각하는 (안드로이드에서 asyncTask가없는 네트워크 작업
private class GetQinfo extends AsyncTask<String, Void,String> {
ProgressDialog progDailog ;
protected void onPreExecute() {
super.onPreExecute();
progDailog= new ProgressDialog(GetTicket.this);
progDailog.setMessage("pls wait");
progDailog.setIndeterminate(false);
progDailog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
progDailog.setCancelable(true);
progDailog.show();
}
protected String doInBackground(String... arg0) {...}
protected void onPostExecute(String branchQ){
...
progDailog.dismiss();
}
}
하지만 내가 정말 필요 없어요 이후이 나에게
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
그래서 내가 AsyncTask를 사용을 중지하기로 결정 예외를 준 : AsyncTask를이 작업을 수행하려고 할 때 추락 내 문제는 시작). 사용자가 UI에서 어떤 작업도 할 수 없으므로 AsyncTask를 사용하는 것이 중요합니까? 나는 스레딩 솔루션에 들어갑니다 :
new Thread(new Runnable() {
public void run() {
String line=null;
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("command", "GetQ"));
nameValuePairs.add(new BasicNameValuePair("city", city));
nameValuePairs.add(new BasicNameValuePair("type", type));
nameValuePairs.add(new BasicNameValuePair("org", org));
nameValuePairs.add(new BasicNameValuePair("branch", spinner.getSelectedItem().toString()));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"utf-8"));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
InputStream is = buf.getContent();
BufferedReader r = new BufferedReader(new InputStreamReader(is));
line = r.readLine();
nameValuePairs.clear();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
line="-1";
}
String[] info=line.split(";");
if(info[1].equals("-1")){
Toast.makeText(getApplicationContext(), "Some msg", Toast.LENGTH_LONG).show();
}
else{
....
//Update the UI
}
}
}).start();
그러나 어떤 이유로이 java.net.SocketException가 던져 : 소켓 HttpResponse에 응답 = httpclient.execute (httppost)이 라인에 문을 닫습니다; 아이디어가 있습니까? 감사합니다
편집 : @Ahmad Dwaik '흑 마법사' 내가 스피너와 내가 java.lang.RuntimeException가 받기를 실행하여 방법
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
if(arg2==0){
//no selection
}
else{
new GetQinfo().execute(city,type,org,spinner.getSelectedItem().toString());
}
가 주 스레드에서 호출 할 : Looper.prepare() 오류를 호출하지 않은 스레드 내부에서 처리기를 만들 수 없습니다. 로그는
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
12-07 10:16:19.285: E/AndroidRuntime(1929): at android.os.Handler.<init>(Handler.java:200)
12-07 10:16:19.285: E/AndroidRuntime(1929): at android.os.Handler.<init>(Handler.java:114)
12-07 10:16:19.285: E/AndroidRuntime(1929): at android.app.Dialog.<init>(Dialog.java:109)
12-07 10:16:19.285: E/AndroidRuntime(1929): at android.app.AlertDialog.<init>(AlertDialog.java:114)
12-07 10:16:19.285: E/AndroidRuntime(1929): at android.app.AlertDialog.<init>(AlertDialog.java:98)
12-07 10:16:19.285: E/AndroidRuntime(1929): at android.app.ProgressDialog.<init>(ProgressDialog.java:77)
12-07 10:16:19.285: E/AndroidRuntime(1929): at com.example.quecustomer.GetTicket$GetQinfo.onPreExecute(GetTicket.java:872)
12-07 10:16:19.285: E/AndroidRuntime(1929): at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
12-07 10:16:19.285: E/AndroidRuntime(1929): at android.os.AsyncTask.execute(AsyncTask.java:535)
12-07 10:16:19.285: E/AndroidRuntime(1929): at com.example.quecustomer.GetTicket$1.run(GetTicket.java:781)
12-07 10:16:19.285: E/AndroidRuntime(1929): at java.lang.Thread.run(Thread.java:841)
GetTicket.java:872이 줄을 참조한다
:
progDailog= new ProgressDialog(GetTicket.this);
내 doInBackground :
Override
protected String doInBackground(String... arg0) {
try {
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("command", "GetQ"));
nameValuePairs.add(new BasicNameValuePair("city", arg0[0]));
nameValuePairs.add(new BasicNameValuePair("type", arg0[1]));
nameValuePairs.add(new BasicNameValuePair("org", arg0[2]));
nameValuePairs.add(new BasicNameValuePair("branch", arg0[3]));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"utf-8"));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
InputStream is = buf.getContent();
BufferedReader r = new BufferedReader(new InputStreamReader(is));
String line = r.readLine();
nameValuePairs.clear();
return line;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@ EDIT 2 그것은 내가 방법을 발견 밝혀 반올림하지만 올바른지 확실하지 않습니다. 잘 작동하므로 꼭 그래야합니다 :)
ProgressDialog를 만들고 onPostExecute()에서 닫으려면 onProgressUpdate (Void ... none)를 사용했습니다. 무엇을 만드시겠습니까? 당신은 당신이 "UI"스레드 홈페이지 내에서 AsyncTask를 new GetQinfo().execute(args);
를 호출하지 않는 것 같습니다 많은 세부 사항
java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
를 제공하지 않은이 오류에 대한
! 나는이 AsyncTask를 두 곳에서 호출한다. 하나는 스레드이고 다른 하나는 스레드로부터 온 것입니다. 그럼 그게 무슨 뜻 이죠? asynctask를 호출하는 스레드에서 진도 대화 상자를 호출 할 수 없습니까? –
아니요, 할 수 없습니다. UI'Thread'만으로'AsyncTask'를 호출해야합니다. – Emmanuel