在不干扰Android的UI的情况下,将服务器和存储中的数据导入数据库的最佳方法是什么?

时间:2015-08-28 06:14:15

标签: android multithreading android-asynctask android-sqlite

我使用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但结果是一样的。

那么,实现这一目标的最佳方法是什么?

2 个答案:

答案 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,否则您可以创建自定义回调