Java Can';t在Android Studio上运行我的MQTT应用程序
我正在测试一个个人MQTT应用程序,但当我单击connect按钮时它失败了。。。有一个例外,但我不知道它来自哪里 这是我的密码 MainActivity.java:Java Can';t在Android Studio上运行我的MQTT应用程序,java,android,android-studio,mqtt,Java,Android,Android Studio,Mqtt,我正在测试一个个人MQTT应用程序,但当我单击connect按钮时它失败了。。。有一个例外,但我不知道它来自哪里 这是我的密码 MainActivity.java: package com.application.phoste.homecontrol; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import andr
package com.application.phoste.homecontrol;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private Paho paho = null;
EditText topic = null;
EditText message = null;
Button connect = null;
Button send = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
paho = new Paho();
topic = (EditText) findViewById(R.id.topic);
message = (EditText) findViewById(R.id.message);
connect = (Button) findViewById(R.id.connect);
connect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
paho.connect();
String res = (paho.isConnected()) ? "Connected" : "Not Connected";
Toast toast = Toast.makeText(getApplicationContext(), res, Toast.LENGTH_SHORT);
toast.show();
}
});
send = (Button) findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
paho.publish(topic.getText().toString(), message.getText().toString());
Toast toast = Toast.makeText(getApplicationContext(), "Message sent", Toast.LENGTH_SHORT);
toast.show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Paho.java:
package com.application.phoste.homecontrol;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
public class Paho implements MqttCallback {
private MqttClient client;
private static final String BROKER = "tcp://192.168.1.189:1883";
private static final int QOS = 2;
public void connect() {
try {
client = new MqttClient(BROKER, MqttClient.generateClientId());
MqttConnectOptions options = new MqttConnectOptions();
options.setConnectionTimeout(1);
client.setCallback(this);
client.connect();
} catch (MqttException e) {
e.getMessage();
}
}
public void disconnect() {
if (client.isConnected()) {
try {
client.disconnect();
} catch (MqttException e) {
e.getMessage();
}
}
}
public boolean isConnected() {
return client.isConnected();
}
public void publish(String topic, String m) {
try {
MqttMessage message = new MqttMessage(m.getBytes());
message.setQos(2);
client.publish(topic, message);
} catch (MqttException e) {
e.getMessage();
}
}
@Override
public void connectionLost(Throwable throwable) {
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
}
例外情况:
07-29 15:17:23.988 15718-15718/com.application.phoste.homecontrol E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.application.phoste.homecontrol, PID: 15718
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean org.eclipse.paho.client.mqttv3.MqttClient.isConnected()' on a null object reference
at com.application.phoste.homecontrol.Paho.isConnected(Paho.java:44)
at com.application.phoste.homecontrol.MainActivity$1.onClick(MainActivity.java:35)
at android.view.View.performClick(View.java:4756)
at android.view.View$PerformClick.run(View.java:19748)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
我还将
行添加到AndroidManifest.xml中
我错在哪里
编辑:
我刚刚意识到,在抛出异常之前,我就收到了一些警告消息。。。这是:
07-29 17:26:52.673 32706-32706/com.application.phoste.homecontrol W/System.err﹕ MqttException (0)
07-29 17:26:52.673 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence.open(MqttDefaultFilePersistence.java:80)
07-29 17:26:52.673 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:286)
07-29 17:26:52.674 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at org.eclipse.paho.client.mqttv3.MqttAsyncClient.<init>(MqttAsyncClient.java:167)
07-29 17:26:52.674 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:224)
07-29 17:26:52.674 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at org.eclipse.paho.client.mqttv3.MqttClient.<init>(MqttClient.java:136)
07-29 17:26:52.675 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at com.application.phoste.homecontrol.MainActivity.onCreate(MainActivity.java:35)
07-29 17:26:52.675 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.Activity.performCreate(Activity.java:5933)
07-29 17:26:52.676 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
07-29 17:26:52.676 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2282)
07-29 17:26:52.676 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2389)
07-29 17:26:52.676 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.ActivityThread.access$900(ActivityThread.java:147)
07-29 17:26:52.676 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1296)
07-29 17:26:52.676 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
07-29 17:26:52.676 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.os.Looper.loop(Looper.java:135)
07-29 17:26:52.676 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5254)
07-29 17:26:52.676 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
07-29 17:26:52.676 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
07-29 17:26:52.676 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
07-29 17:26:52.678 32706-32706/com.application.phoste.homecontrol W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
但是它仍然不起作用,我从de debug按钮获得空Toast。您的“客户端”对象在尝试对其执行某些操作时未初始化
移动此行:client=newmqttclient(代理,MqttClient.generateClientId())代码>
到应用程序中的其他位置(可能是onCreate()),以确保在访问变量之前已正确初始化该变量。i好,因此需要设置MQTT文件持久化路径,这将需要对SD卡及其指定路径进行写访问
您还需要添加访问文件系统的正确权限。您需要将e.getMessage()替换为e.printStackTrace(),以便您可以看到错误。因此,您应该在AsynTask中执行所有MQTT工作,就像在网络IO中一样,这不应该在Android应用程序的主线程上执行,但这并不能解决我的问题。为什么我的客户端对象没有初始化?是因为我在onCreate()函数中调用了它吗?除非我们在跟踪中看到丢失的异常消息,否则我们可能无法回答这个问题。对不起,我将所有的e.getMessage()更改为e.printStackTrace(),但id不会更改我得到的异常的格式。这仍然是上面的相同。有没有可能是因为我添加了错误的库?或者可能uses权限不是很好?来自paho的connect()函数(当我按下connect按钮时)是第一个被调用的函数,它初始化了客户机,显然不是。也许还有别的东西在那个点上抛出一个空指针。总之,您正在尝试访问一个尚未初始化的对象,这就是您的问题。我试图通过放置client=new MqttClient(BROKER,MqttClient.generateClientId())来调试我的问题代码>在Paho的构造函数中,以确保它已初始化,但它仍然没有…我更改了代码并将所有内容放入MainActivity中,但它仍然没有初始化,我仍然不明白为什么。我更新了我原来的帖子,也许在应用程序崩溃之前我收到的消息有点太多了!现在似乎可以工作了,我的客户端变量终于设置好了。。。我认为持久性文件是不必要的(我从来没有在简单的java编程中使用过它),我现在的问题是它说缺少internet权限,但我在AndroidManifest.xml
中写了这一行,我只是将
更改为
,它工作得很好!再次感谢
package com.application.phoste.homecontrol;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
public class MainActivity extends Activity {
EditText topic = null;
EditText message = null;
Button send = null;
Button debug = null;
MqttClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
client = new MqttClient("tcp://m2m.eclipse.org:1883", MqttClient.generateClientId());
MqttConnectOptions options = new MqttConnectOptions();
options.setConnectionTimeout(1);
client.connect();
} catch (MqttException e) {
e.printStackTrace();
}
topic = (EditText) findViewById(R.id.topic);
message = (EditText) findViewById(R.id.message);
send = (Button) findViewById(R.id.send);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
MqttMessage m = new MqttMessage(message.getText().toString().getBytes());
m.setQos(2);
client.publish(topic.getText().toString(), m);
Toast toast = Toast.makeText(getApplicationContext(), "Message sent", Toast.LENGTH_SHORT);
toast.show();
} catch (MqttException e) {
e.printStackTrace();
}
}
});
debug = (Button) findViewById(R.id.debug);
debug.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String res = (client == null) ? "Null" : "Not Null";
Toast toast = Toast.makeText(getApplicationContext(), res, Toast.LENGTH_SHORT);
toast.show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}