java - 由于无法在未调用 Looper.prepare() 的线程内创建处理程序而导致没有互联网连接时 Android 应用程序崩溃

标签 java android

我正在为一个 session 开发我的 Android 应用程序。在我的登录页面中,当没有互联网连接时,我打印了一条错误消息。但是,当没有互联网连接时应用程序崩溃,并且在 logcat 中显示以下错误消息。 我关注了堆栈溢出的许多问题,可能是我无法理解,我找不到答案。

08-19 10:01:21.840  

8931-9124/com.NICT.nict E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-691

java.lang.RuntimeException: Can't create handler inside thread that hasnot called Looper.prepare()

           at android.os.Handler.<init>(Handler.java:205)

           at android.os.Handler.<init>(Handler.java:119)

           atandroid.widget.Toast$TN.<init>(Toast.java:325)

           atandroid.widget.Toast.<init>(Toast.java:91)

           atandroid.widget.Toast.makeText(Toast.java:239)

           at com.NICT.nict.services.MessageHandler.showMessage(MessageHandler.java:9)
           at com.NICT.nict.LoginActivity$1$1.run(LoginActivity.java:117)

           at java.lang.Thread.run(Thread.java:838)

这是我的登录 Activity

package com.NICT.nict;

import org.json.JSONObject;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;

import com.NICT.nict.WorkShopActivity.HttpAsyncTask;
import com.NICT.nict.services.EmailValidator;
import com.NICT.nict.services.MessageHandler;
import com.NICT.nict.services.ServiceHandler;

public class LoginActivity extends Activity {

	public final static String URL = "http://demo.et.lk/nitcapi/api/login";

	public static String Uid;

	private Button loginBtn;

	private EditText codeEdit;

	private EditText nameEdit;

	private EditText emailEdit;

	private ServiceHandler sh = new ServiceHandler();

	private boolean errorStatus;
	
	private ProgressBar spinner;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_login);

		loginBtn = (Button) findViewById(R.id.loginBtn);
		codeEdit = (EditText) findViewById(R.id.codeEdit);
		nameEdit = (EditText) findViewById(R.id.nameEdit);
		emailEdit = (EditText) findViewById(R.id.emailEdit);
		spinner = (ProgressBar) findViewById(R.id.progressBar1);
		spinner.setVisibility(View.GONE);
		loginBtn.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {

				if (!ServiceHandler.isOnline(getApplicationContext())) {
					MessageHandler.showMessage("You are not online.",
							getApplicationContext());
				}
				new Thread(new Runnable() {
					public void run() {

						String code = codeEdit.getText().toString();
						String email = emailEdit.getText().toString();
						String name = nameEdit.getText().toString();
						if (code.length() == 0) {
							runOnUiThread(new Runnable() {
								public void run() {
									MessageHandler.showMessage(
											"Please Enter the app code",
											getApplicationContext());
									errorStatus = true;
								}
							});
							;
						} else if (name.length() == 0) {
							runOnUiThread(new Runnable() {
								public void run() {
									MessageHandler.showMessage(
											"Please Enter Your Name",
											getApplicationContext());
									errorStatus = true;
								}
							});
							;
						} else if (email.length() == 0) {
							runOnUiThread(new Runnable() {
								public void run() {
									MessageHandler.showMessage(
											"Please Enter Your Email",
											getApplicationContext());
									errorStatus = true;
								}
							});
							;
						}
						
						EmailValidator emailValidator = new EmailValidator();
						if(!emailValidator.validate(email)){
							runOnUiThread(new Runnable() {
								public void run() {
									MessageHandler.showMessage(
											"Invalid Email",
											getApplicationContext());
									errorStatus = true;
								}
							});
							;
						}

						String jsonStr = null;
						if (!errorStatus) {
							
							if (!ServiceHandler.isOnline(getApplicationContext())) {
								MessageHandler.showMessage("You are not online.",
										getApplicationContext());
							} else {
								ConnectivityManager conMgr = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
								

									    // notify user you are online
									try{
										 runOnUiThread(new Runnable() {
												public void run() {
										spinner.setVisibility(View.VISIBLE);
												}
											});
											;
										
									jsonStr = sh.makeServiceCall(URL + "/" + code + "/"
											+ name + "/" + email, ServiceHandler.GET);
									System.out.println(URL + "/" + code + "/" + name + "/"
											+ email);
									
									}
								 catch (Exception e){
									 spinner.setVisibility(View.GONE);
									 runOnUiThread(new Runnable() {
											public void run() {
									 MessageHandler.showMessage("You are not online.",
												getApplicationContext());
									 
											}
										});
										;
									 
									 
								 }

								
							}

							if (jsonStr != null) {
								String status = "";
								String msg = "";

								try {
									JSONObject jsonObj = new JSONObject(jsonStr);
									 runOnUiThread(new Runnable() {
											public void run() {
									spinner.setVisibility(View.GONE);
											}
										});
										;
									
									if (jsonObj != null
											&& jsonObj.has("status")) {
										status = jsonObj.getString("status");
										msg = jsonObj.getString("message");
										if(jsonObj.has("uid"))
											Uid = jsonObj.getString("uid");
										System.out.println(jsonObj);
										if (status.equals("OK")) {
											Intent myIntent = new Intent(
													getBaseContext(),
													MainMenuActivity.class);
											startActivityForResult(myIntent, 0);
										} else if (status.equals("ERROR")) {
											final String errorMsg = msg;
											runOnUiThread(new Runnable() {
												public void run() {
													MessageHandler
															.showMessage(
																	errorMsg,
																	getApplicationContext());
												}
											});
											;
										} else {
											runOnUiThread(new Runnable() {
												public void run() {
													MessageHandler
															.showMessage(
																	"Oops..! something wrong with the service. Please try again Later.",
																	getApplicationContext());
												}
											});
											;
										}
									}
								} catch (Exception e) {
									System.out
											.println("Creation of json object failed");
								}

							}
						}

					}
				}).start();

			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.login, menu);
		return true;
	}

}

这是我的 serviceHandler。

package com.NICT.nict.services;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class ServiceHandler {

	static String response = null;
	public final static int GET = 1;
	public final static int POST = 2;

	public ServiceHandler() {

	}

	/**
	 * Making service call
	 * 
	 * @url - url to make request
	 * @method - http request method
	 * */
	public String makeServiceCall(String url, int method) {
		return this.makeServiceCall(url, method, null);
	}

	/**
	 * Making service call
	 * 
	 * @url - url to make request
	 * @method - http request method
	 * @params - http request params
	 * */
	public String makeServiceCall(String url, int method,
			List<NameValuePair> params) {
		try {
			// http client
			DefaultHttpClient httpClient = new DefaultHttpClient();
			HttpEntity httpEntity = null;
			HttpResponse httpResponse = null;

			// Checking http request method type
			if (method == POST) {
				HttpPost httpPost = new HttpPost(url);
				// adding post params
				if (params != null) {
					httpPost.setEntity(new UrlEncodedFormEntity(params));
				}

				httpResponse = httpClient.execute(httpPost);

			} else if (method == GET) {
				// appending params to url
				if (params != null) {
					String paramString = URLEncodedUtils
							.format(params, "utf-8");
					url += "?" + paramString;
				}
				HttpGet httpGet = new HttpGet(url);

				httpResponse = httpClient.execute(httpGet);

			}
			httpEntity = httpResponse.getEntity();
			response = EntityUtils.toString(httpEntity);

		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return response;

	}

	public static boolean isOnline(Context ctx) {
		ConnectivityManager cm;
		NetworkInfo info = null;
		try {
			cm = (ConnectivityManager) ctx
					.getSystemService(Context.CONNECTIVITY_SERVICE);
			info = cm.getActiveNetworkInfo();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return (info!=null&&!info.equals(null));
	}
}

最佳答案

在您的 if 条件中添加以下代码段::

 if (!ServiceHandler.isOnline(getApplicationContext())) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(
    new Runnable()
    {
        @Override
        public void run()
        {
            MessageHandler.showMessage("You are not online.",
                        getApplicationContext());
        }
    }
);
}

关于java - 由于无法在未调用 Looper.prepare() 的线程内创建处理程序而导致没有互联网连接时 Android 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32086994/

相关文章:

java - Android 中的 ImageView 没有变化

java - 如何将 EditText 的起始边缘放置在屏幕的水平中心?

java - Android 注释处理器从不同模块访问带注释的类

android - Android Gradle无法找到Apache库

java - 消息传送 : Lots of RemoteServices methods or Unique message builder/interpreter?

java - Hibernate一对多集合删除

java - 如何读取 Amazon S3 中的文件内容

android - 当我选择一次菜单选项时。 onOptionsItemSelected 被调用了两次。 (安卓)

android - 升级android studio后Executor Singleton未启动

Android:在 Intent 过滤器中匹配主机模式