我正在使用Web服务从服务器获取城市,州和产品数据,并分别使用单独的线程将其存储在数据库中。
但是,当我尝试访问UI时,它显示警告提示应用程序未通过“等待”和“关闭”按钮进行响应。
Thread thread = new Thread(new Runnable() {
HttpClient Client = new DefaultHttpClient();
public void run() {
try {
String res = "";
HttpGet httpget = new HttpGet(URL);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
res = Client.execute(httpget, responseHandler);
threadMsg(res);
} catch (Throwable t) {
Log.i("test", "Thread exception " + t);
}
}
void threadMsg(String msg) {
if (!msg.equals(null) && !msg.equals("")) {
Message msgObj = handler.obtainMessage();
Bundle b = new Bundle();
b.putString("message", msg);
msgObj.setData(b);
handler.sendMessage(msgObj);
}
}
Handler handler = new Handler() {
public void handleMessage(Message msg) {
String aResponse = msg.getData().getString("message");
if ((null != aResponse)) {
// stores data in database
}
else
{
// failed or empty response
}
}
};
});
thread.start();
我使用单独的线程进行单独的Web服务调用。我也尝试过使用AsyncTask,但结果是相同的。
那么,实现此目标的最佳方法是什么?
您应该为此目的使用服务。
您可以按照以下步骤操作:
IntentService
AndroidManifest
文件中添加服务类在onHandleIntent
服务类的方法中,执行操作。在您的情况下,您需要从服务器获取数据并将其存储在数据库中。
当您想要执行操作时,即在您体内Activity
,创建一个Intent
对象并将其传递给这样的startService
方法
示例代码:示例服务类
public class HelloIntentService extends IntentService {
public HelloIntentService() {
super("HelloIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
// if additional parameters are sent, receive them in the following way
Bundle bundle = intent.getExtras();
String parameter1 = bundle.getString("param1");
int parameter2 = bundle.getInt("param2");
HttpClient Client = new DefaultHttpClient();
String res = "";
HttpGet httpget = new HttpGet(URL);
ResponseHandler<String> responseHandler = new BasicResponseHandler();
try {
res = Client.execute(httpget, responseHandler);
} catch (IOException e) {
// handle exception
}
// store data in database
}
}
在清单文件中
<manifest ... >
...
<application ... >
<service android:name=".HelloIntentService" />
...
</application>
</manifest>
有关如何调用服务的样本活动代码
public class HelloActivity extends Activity {
// call the service where you need
private void myMethod(){
Intent mServiceIntent = new Intent(this, HelloIntentService.class);
// you can send additional parameters this way
mServiceIntent.putExtra("param1", "Sample Parameter Value");
mServiceIntent.putExtra("param2", 100);
startService(mServiceIntent);
}
}
在这里查看详细信息:
http://developer.android.com/guide/components/services.html https://developer.android.com/training/run-background-service/send-request.html
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句