我使用Web服务从服务器获取城市,州和产品数据,并分别使用单独的线程将其存储在数据库中。
但是当我尝试访问用户界面时,它会显示警告,应用程序没有响应等待和关闭按钮。
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但结果是一样的。
那么,实现这一目标的最佳方法是什么?
答案 0 :(得分:2)
您应该为此目的使用服务。
您可以按照以下步骤操作:
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
答案 1 :(得分:0)
使用AsyncTask获取数据并将其存储在数据库中,这样您就不会得到任何ANR
在doInBackground ()
您可以使用onPostExecute(Result)
通知ui,否则您可以创建自定义回调