私は、AsyncTaskを拡張する別のクラスのLongOperationを使ってアクセスするサーバーからデータにアクセスしているアンドロイドのアプリケーションを持っています。今私はLongOperationクラスのデータを取得しますが、私はsqlitedbに格納するために使用する必要がある別のクラスオブジェクトでこのデータをコピーすることはできません。 私はsqlitedbに直接データを書き込もうとしましたが、LongOperationクラスがアクティビティではないため、コンテキストを渡すことができません。(新しいMainActivity()、DATABASE_NAME、null、 sqlitedbの必要に応じて 。 データをフェッチするオブジェクトには、クラスライブラリを使用してアクセスします。 ActivityであるMainActivityクラスのボタンクリックからLongOperationクラスを呼び出しますが、ここからのコンテキストは機能しません。 以下は、呼び出しおよびデータフェッチ手順を示す関連する抜粋です。 (別のファイルに)(別のファイルに)あるクラスから別のクラスへのデータを別のクラスにコピーする
MainActivityボタンを押してコード
import LibPack.UpdateData;
public static UpdateData upd;
public void onClick(View arg0) {
upd = new UpdateData();
LongOperation.getUserData = true;
lo = new LongOperation();
lo.execute("");
}
LongOperationクラスコード
import LibPack.UpdateData;
public static class LongOperation extends AsyncTask<String, Void, String> {
public static UpdateData upd;
@Override
protected String doInBackground(String... params) {
if (getUserData) {
upd = *data fetched from server*
}
}
は、どのように私は戻って、このクラスからデータを返しませんMainActivity?または、他のクラスを介してアクセスできるように、ファイルにデータを格納する別の方法がある場合は、オブジェクト内のデータは、文字列[]形式とキー値のペアです。ここでの問題は、LongOperationクラスが非アクティビティクラスであるために発生します。したがって、ファイルライターまたはsharedpreferencesを使用しているときにコンテキストを渡す方法はありません。
編集1:
MainActivity
package com.sam.vehicle;
import com.example.vehicle.R;
import com.sam.vehicle.CommonData.LongOperation;
import LibPack.UpdateData;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Button;
public class MainActivity extends Activity implements AsyncResponse{
Button b;
public static LongOperation lo = new LongOperation();
public static String resp;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lo.delegate = this;
b = (Button) findViewById(R.id.btnProceed);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
upd = new UpdateData();
CommonData.getUserData = true;
System.out.println("Before execute");**//prints fine**
lo.execute("");
System.out.println("At main extract");**//prints with previous sysout**
System.out.println("At main extract resp = "+resp);**//prints = null**
Intent ii = new Intent(arg0.getContext(), LoginActivity.class);
ii.putExtra("number", phoneNumber.getText().toString());
startActivity(ii);
}
});
}
@Override
public void processFinish(String output) {
// TODO Auto-generated method stub
System.out.println("Executed processFinish in main. output = "+output);**//doesn't print
resp = output;
}
}
AsyncTaskクラス:
package com.sam.vehicle;
import com.example.vehicle.R;
public class CommonData {
public static boolean getUserData = false;
public static String resp;
public static class LongOperation extends AsyncTask<String, Void, String> {
public AsyncResponse delegate = null;
@Override
protected void onPostExecute(String result) {
System.out.println("In commondata onpostexe");**//doesn't print**
delegate.processFinish(result);
}
@Override
protected String doInBackground(String... params) {
if (getUserData) {
sendToServer = false;
try {
upd = (UpdateData) stringToObject(resp);
for (int i = 0; i < upd.pass.length; i++) {
System.out.println("upd.usn["+i+"]"+upd.usn[i]);
System.out.println("upd.pass["+i+"]"+upd.pass[i]);
}**//prints fine here**
System.out.println("in commondata resp="+resp);**//prints fine here**
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println("resp from common return = "+resp);**//doesn't print**
return resp;
}
}
AsyncTaskのドキュメントを読む必要があります。これはそこにカバーされています。 – Jeroen