エラーが発生した理由が不明です。AsyncTask の使用方法が間違っているためですか?
私は現在、Androidカレンダーアプリを開発しています。ユーザーが自分のデータをサーバーまたはその逆に同期できるようにする同期機能が必要です。
ユーザーがアプリを開くと、サーバーからデータを取得し、新しいデータを Android デバイスの sqlite データベースに更新します。
また、ユーザーが新しいデータを作成するたびに、このデータをサーバーに送信して、サーバー上のデータベースに更新します。
こんな感じで理想を実現しました。
1. 同期アクションを実行する MainActivity クラス
public class MainActivity extends Activity {
DataSyncTask syncTask;
public void onCreate(Bundle savedInstanceState){
Button insertBt = (Button) findViewById(R.id.bt_insert);
// get data1
Data1 data1;
syncTask = new DataSyncTask(this);
syncTask.syncOnStart(data1);
insertBt.setOnClickListener(new OnClickListener(){
public void onClick(View v){
Data2 data2;
// get data2
syncTask.syncOnInsert(data2);
}
});
}
}
2. asyncTask を収集する DataSyncTask
public class DataSyncTask {
Context mContext;
public DataSyncTask(Context context){
mContext = context;
}
private class SyncWhenStartTask extends AsyncTask<Data1, Integer, String>{
protected String doInBackground(Data1... data1s){
Object obj1 = ServerUtilities.sendDataForStep1(data1s[0]);
Data2 data2;
// Process Object
Object obj2 = ServerUtilities.sendDataToInsert(data2);
return "Success";
}
}
private class SyncWhenInsertTask extends AsyncTask<Data2, Integer, String>{
protected String doInBackground(Data2... datas){
Object obj2 = ServerUtilities.sendDataToInsert(datas[0]);
return "Success";
}
}
public void syncOnStart(Data1 data1){
new SyncWhenStartTask().execute(data1);
}
public void syncOnInsert(Data2 data2){
new SyncWhenInsertTask().execute(data2);
}
}
3. ServerUtilities クラス
public final class ServerUtilities {
static final String SERVER_URL = "http://172.2.100.99:8080";
public static String sendDataForStep1(Data1 data1) {
String url = SERVER_URL + "/sendDataForStep1";
ServerUtil<Data1, String> server = ServerUtil<Data1, String>();
return server.post(url, data1, String.class);
}
public static String sendDataToInsert(Data2 data2) {
String url = SERVER_URL + "/sendDataToInsert";
ServerUtil<Data2, String> server = ServerUtil<Data2, String>();
return server.post(url, data2, String.class);
}
private static class ServerUtil<T1, T2> {
public T2 post(String url, T1 obj, Class<T2> returnType) {
HttpHeaders requestHeaders = new HttpHeaders();
// Sending a JSON or XML object i.e. "application/json" or
// "application/xml"
requestHeaders.setContentType(MediaType.APPLICATION_JSON);
// Populate the Message object to serialize and headers in an
// HttpEntity object to use for the request
try {
HttpEntity<T1> requestEntity = new HttpEntity<T1>(
object, requestHeaders);
// Create a new RestTemplate instance
RestTemplate restTemplate = new RestTemplate(true);
// Make the network request, posting the message, expecting
// a list of SyncData in response from the server
ResponseEntity<T2> response = restTemplate
.exchange(url, HttpMethod.POST, requestEntity, returnType);
if(response != null) {
return response.getBody();
}
} catch (Exception e) {
Log.e(TAG + "-Exception", e.getMessage()); // Line 345 in logcat
}
return null;
}
}
}
MainActivity を起動すると、サーバーに接続し、データをフェッチし、sqlite データベースに更新し、デバイスからサーバーに新しいデータを送信して更新を成功させます。すべて問題ありません。しかし、新しいデータを作成すると、syncTask.syncOnInsert() を実行すると、例外が発生します。
11-30 14:38:25.849: W/dalvikvm(14140): threadid=12: thread exiting with uncaught exception (group=0x40a13300)
11-30 14:38:25.869: E/AndroidRuntime(14140): FATAL EXCEPTION: AsyncTask #2
11-30 14:38:25.869: E/AndroidRuntime(14140): java.lang.RuntimeException: An error occured while executing doInBackground()
11-30 14:38:25.869: E/AndroidRuntime(14140): at android.os.AsyncTask$3.done(AsyncTask.java:299)
11-30 14:38:25.869: E/AndroidRuntime(14140): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
11-30 14:38:25.869: E/AndroidRuntime(14140): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
11-30 14:38:25.869: E/AndroidRuntime(14140): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
11-30 14:38:25.869: E/AndroidRuntime(14140): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
11-30 14:38:25.869: E/AndroidRuntime(14140): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
11-30 14:38:25.869: E/AndroidRuntime(14140): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
11-30 14:38:25.869: E/AndroidRuntime(14140): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
11-30 14:38:25.869: E/AndroidRuntime(14140): at java.lang.Thread.run(Thread.java:856)
11-30 14:38:25.869: E/AndroidRuntime(14140): Caused by: java.lang.NullPointerException: println needs a message
11-30 14:38:25.869: E/AndroidRuntime(14140): at android.util.Log.println_native(Native Method)
11-30 14:38:25.869: E/AndroidRuntime(14140): at android.util.Log.e(Log.java:231)
11-30 14:38:25.869: E/AndroidRuntime(14140): at vn.com.bip.office.smart.form.ServerUtilities$ServerUtil.post(ServerUtilities.java:345)
11-30 14:38:25.869: E/AndroidRuntime(14140): at vn.com.bip.office.smart.form.ServerUtilities.sendSyncData(ServerUtilities.java:283)
11-30 14:38:25.869: E/AndroidRuntime(14140): at vn.com.bip.office.smart.util.DataSyncTask$SyncWhenChangeOnScheduleTask.doInBackground(DataSyncTask.java:158)
11-30 14:38:25.869: E/AndroidRuntime(14140): at vn.com.bip.office.smart.util.DataSyncTask$SyncWhenChangeOnScheduleTask.doInBackground(DataSyncTask.java:1)
11-30 14:38:25.869: E/AndroidRuntime(14140): at android.os.AsyncTask$2.call(AsyncTask.java:287)
11-30 14:38:25.869: E/AndroidRuntime(14140): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
11-30 14:38:25.869: E/AndroidRuntime(14140): ... 5 more
なぜこれが起こるのかを説明し、このエラーを解決する方法を教えてください。
前もって感謝します!