我将 Activity 用作对话框(不认为有问题,但我提到了它)。
该对话框从用户那里获取一些数据,然后Apache's HttpClient
我将这些数据发送到 Web 服务。这意味着我有一个 Button 和一个与该 Button 关联的 onClick() 方法。当onClick()
发生时,我获取用户添加的数据并将其传递给将它们作为 JSON 发送的方法(命名为sendJSON )。
然后我添加了线程的代码。我扩展了 AsyncTask 作为参数传递数据,在里面doInBackground
我调用了我的sendJSON方法,现在在 onClick 里面我只是execute()
用用户数据作为参数来调用。
从我在 Google 上搜索的内容来看,错误是我调用了我的 Activity,因此我可以调用该sendJSON
方法。然后是这样的:
Do not access the Android UI toolkit from outside the UI thread
所以我有两个问题。有什么快速解决此问题的方法?runOnUiThread
在 onClick() 方法里面会为我工作吗?其次,从一开始我的逻辑有什么问题?我开始构建我需要的方法,然后为 Thread 添加代码。那么我应该如何从一开始就想到呢?
我花了很多时间去思考,编写代码并搜索以了解哪里出了问题,所以我只想知道我应该从中学到什么,不要再重复同样的错误。
谢谢
编辑:代码
点击:
@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);
}
}
异步任务:
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) {
//
}
}
发送JSON
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):致命异常: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): 在 java.util.concurrent.FutureTask.setException(FutureTask.java :124) 06-08 05:33:59.801: E/AndroidRuntime(397): 在 java.util.concurrent.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.java: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): 在 org.teo.wifit.DialogActivity$LongSend.doInBackground(DialogActivity.java:88 ) 06-08 05:33:59.801: E/AndroidRuntime(397): 在 org.teo.wifit.DialogActivity$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();