我的问题是,如果用户未能在数据库上进行操作,我就会进行吐司,但即使用户在我的数据库Login_layout
中进行了操作,吐司仍然会出现。
class BuatLogin extends AsyncTask<String, String , String> {
/**
* Sebelum memasuki menu buat progres dialog
* */
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(Login_layout.this);
pDialog.setMessage("Login_layout Progress...");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
/**
* Konkesi
* */
protected String doInBackground(String... args) {
String usr = user.getText().toString();
String pwd = pass.getText().toString();
Log.d("1 "+usr, pwd);
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("usr", usr));
params.add(new BasicNameValuePair("pwd", pwd));
Log.d("2 "+usr, pwd);
Log.d(usr,url_create_login);
// getting JSON Object
// login url menerima POST method
JSONObject json = jsonParser.makeHttpRequest(url_create_login,
"POST", params);
// cek log untuk response
Log.d("Buat Respond", json.toString());
// check untuk sukses tag
try {
int sukses = json.getInt(TAG_SUKSES);
if (sukses == 1) {
String nim=json.getString(TAG_NIM);
Log.d(TAG_NIM,nim);
// sukses login
Intent i = new Intent(getApplicationContext(), Mhs_main_layout.class);
i.putExtra(TAG_NIM, nim);
startActivity(i);
// tutup layar
finish();
} else if(sukses == 2) {
String nim=json.getString(TAG_NIM);
Log.d(TAG_NIM,nim);
Intent i = new Intent(getApplicationContext(), Admin_main_layout.class);
i.putExtra(TAG_NIM, nim);
startActivity(i);
// tutup layar ini
finish();
}else if(sukses == 3){
setResult(100);
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
protected void onPostExecute(String file_url) {
int resultCode = 100;
if (resultCode == 100) {
Toast.makeText(Login_layout.this, "Nip/Nim Atau Password TIdak Sesuai Silahkan Coba Lagi ", Toast.LENGTH_LONG).show();
}
pDialog.dismiss();
}
} }
答案 0 :(得分:0)
很难理解你想要实现的目标,时间和方式。无论如何,那里return null"
看起来非常糟糕。
您应该返回一些有用的信息来发布执行。也许在那里你可以检查结果是否是预期的结果。
函数永远不应返回“随机”结果。
你应该尝试重新学习一些OOP和/或java。
您肯定会返回“null”,并且您已编程该函数以返回String
。
说完后......
您应该编写代码以在onPostExecute
中生成Toast消息,因为它可以访问视图。
修改强>
logcat是否在此行Toast.makeText(Login_layout.this...
中说错误?
我不确定它是否写得好。 Some1请评论,但我认为你应该写v.getContext()
而不是Login_layout.this
答案 1 :(得分:0)
您可以使用onProgressUpdate(Progress...values)
方法,该方法完全符合您的要求。在doInBackground()
中,拨打publishProgress(Progress...values)
并在那里Toast
。
顺便说一句:请考虑阅读有关代码质量,面向对象编程的书籍,并在阅读时,阅读Android API文档。
修改/ ADDITION 强>
Basis AsyncTask概述(请记住,您正在使用Thread
开始新的AsyncTask
)
public class Operation extends AsyncTask<ParamA, ParamB, ParamC> {
@Override
protected ParamC doInBackground(ParamA... params) {
return new ParamC();
}
@Override
protected void onPostExecute(ParamC result) {
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(ParamB... values) {
}
}
其中ParamA
,ParamB
和ParamC
只是用于显示其中使用内容的类:
private class ParamA { }
private class ParamB { }
private class ParamC { }
当您通过new Operation().execute(new ParamA());
执行操作时,将调用第一个onPreExcute
来实例化您可能需要的一些变量(如设置连接)。然后将execute
中的给定参数放在doInBackground
中作为参数。完成后,doInBackground
的返回值将作为参数传递到onPostExecute
,您可以在其中显示结果。
在doInBackground
中,您可以将结果发布到UI线程。快捷方式是在publishProgress
中使用doInBackground
,因为您无法直接从doInBackground
调用UI线程(因为AsyncTask
是另一个Thread
,而不是import java.util.Random;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class AsyncTaskActivity extends Activity implements OnClickListener {
private Button button;
private LinearLayout linearLayout;
private TextView textView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
button = new Button(this);
button.setText("Click to start operation");
textView = new TextView(this);
textView.setText("NOT STARTED YET");
linearLayout.addView(button);
linearLayout.addView(textView);
setContentView(linearLayout);
button.setOnClickListener(this);
}
public void onClick(View view){
if (view == button)
new LongOperation().execute("Hello");
}
private class LongOperation extends AsyncTask<String, Integer, Double> {
@Override
protected Double doInBackground(String... params) {
for(int i = 1; i < params[0].length(); i++) {
try {
Thread.sleep(2000);
publishProgress(i, i*i); //proper way to publish results while task is running.
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
return new Random().nextDouble();
}
@Override
protected void onPostExecute(Double result) {
textView.setText("Done: random result is " + result);
}
@Override
protected void onPreExecute() {
Toast.makeText(AsyncTaskActivity.this, "onPreExcecute", Toast.LENGTH_SHORT).show();
}
@Override
protected void onProgressUpdate(Integer... values) {
textView.setText("We just slept for a total of " + (values[0] * 2) + " seconds, (and btw: " + values[0] + " to the power of 2 is " + values[1] + ").");
}
}
}
在UI线程上运行。
实际有用的示例
Threads
您还可以通过此代码访问其他doInBackground
(或AsyncTaskActivity.this.runOnUiThread(new Runnable() {
public void run() {
textView.setText("Called the UI from Thread");
}
});
)中的UI主题(尽管您应该尽量避免使用它):
{{1}}