私のアプリケーションを動作させるために、私のサーバーからデータを取得する必要があります。これを行うために、私はPOSTを使用します。限り、私は知っているように、私はメインスレッドにすることはできませんスレッドでそのデータを要求する必要があります。私は、UIスレッドで定義された変数に、私が受け取っているデータを置くためにちょっとdiffcultを見つけています。だから、私の質問は、それを行うための最善の方法は何ですか? AsyncTaskの内部で呼び出されるセッターを使用して、たとえばメインアクティビティで定義された変数の値を設定するのは正しいですか?または、このオプションが良いかもしれませんか?サーバーからデータをリクエストする最も良い方法
Thread nt = new Thread(){
@Override
public void run(){
try{
//get data with POST and then something like main.setValue(data);
}catch(Exception e){
e.printStackTrace();
}
}
};
nt.start();
私はそれをアーカイブするためにインタフェースを使用するかもしれないと読んだことがありますが、それは私がまだよく理解していない概念です。私は直接データを返すメソッドを使用したいと思いますが、私が知る限りは不可能です。 あなたの時間のためのThabks!
EDIT:NoChinDeluxe回答に応じて新たなコード:
public class LoginHandler {
public static class Login extends AsyncTask<String, String, Integer> {
LoginCallback listener;
@Override
protected Integer doInBackground(String... params) {
URL url;
postDataParams.put("name", params[0]);
HashMap<String, String> postDataParams = new HashMap<String, String>();
postDataParams.put("password", params[1]);
try {
url = new URL("http://mashiron.xyz/_03z/gmpia/proc.php");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(15000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setDoInput(true);
conn.setDoOutput(true);
OutputStream os = conn.getOutputStream();
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(os, "UTF-8"));
writer.write(HttpHandler.getPostDataString(postDataParams));
writer.flush();
writer.close();
os.close();
System.out.println("Respuesta: "+conn.getResponseCode());
return conn.getResponseCode();
} catch (Exception e) {
e.printStackTrace();
return 404;
}
}
protected void onPostExecute(int result){
System.out.println("Respuesta 2: "+result);
listener.onResultReceived(result);
}
}
public interface LoginCallback {
void onResultReceived(int result);
}
}
EDIT:NoChinDeluxeための追加例外:
3月24日17:38:09.072 13312から13312/COM。 pazzazz.geomoments E/AndroidRuntime:致命的な例外:メイン プロセス:com.pitazzo.geomoments、PID:13312 java.lang.NullPointerException:インタフェースメソッド 'void com.pitazzo.geomo (null)オブジェクト参照のnull.Handlers $ Login.allPostExecute(LoginHandler.java:65) com.pitazzo.geomoments.Handlers.LoginHandlerでログインします。 LoginHandler $ Login.onPostExecute(LoginHandler.java:17) とandroid.os.AsyncTask.finish(AsyncTask.java:636) at android.os.AsyncTask.access $ 500(AsyncTask.java:177) にandroid.os .AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:653)android.os.Handler.dispatchMessage(Handler.java:102)の のandroid.os.Looper.loop(Looper.java:135) android.app .ActivityThread.main(Activi tyThread.java:5300) at java.lang.reflect.Method.invoke(ネイティブメソッド) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit com.android.internal.os.ZygoteInit.mainで$ MethodAndArgsCaller.run(ZygoteInit.java:904) (ZygoteInit.java:699)
EDIT:NoChainDeluxe
public class LoginActivity extends AppCompatActivity implements LoginHandler.LoginCallback{
EditText name;
EditText password;
Button login;
int code;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_activity);
/*
if(logueado){
}
*/
name = (EditText) findViewById(R.id.loginuser);
password = (EditText) findViewById(R.id.loginpassword);
login = (Button) findViewById(R.id.loginlogin);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String params[] = {name.getText().toString(), password.getText().toString()};
System.out.println("Params: "+params.toString());
new LoginHandler.Login().execute(params);
System.out.println("Respuesta 4: "+code);
if(code == 200){
Toast toast1 =
Toast.makeText(getApplicationContext(),
"Iniciado sesión", Toast.LENGTH_SHORT);
toast1.show();
}else{
Toast toast1 =
Toast.makeText(getApplicationContext(),
"Nombre de usuario y/o contraseña incorrectos: "+code, Toast.LENGTH_SHORT);
toast1.show();
}
}
});
}
public void onResultReceived(int resultado) {
code = resultado;
System.out.println("Respuesta 3: "+code);
}
}のためのより多くのコード
必要に応じてAysncTaskを使用してください。あなたがそれを使うなら、セッターは必要ありません。 AsyncTaskのonPostExecute()メソッドでは、UIを更新できます。 –