android java上下文解释

时间:2012-09-03 12:38:30

标签: java android function android-context

我有以下问题:

我必须使用BT打印机SDK中的以下功能:

    StarIOPort port = null;
    byte[] texttoprint = new byte[]{0x1b, 0x40, 0x1b,0x74,0x0D,(byte) 0x91,(byte) 0x92,(byte) 0x93,(byte) 0x94,(byte) 0x95,(byte) 0x96,(byte) 0x97,(byte) 0x98,(byte) 0x99,0x0A,0x0A,0x0A,0x0A,0x0A};


    try 
    {
        port = StarIOPort.getPort(portName, portSettings, 10000, context);
        port.writePort(textToPrint, 0, textToPrint.length);
        port.writePort(new byte[] {0x0a}, 0, 1);
    }
    catch (StarIOPortException e)
    {
        Builder dialog = new AlertDialog.Builder(context);
        dialog.setNegativeButton("Ok", null);
        AlertDialog alert = dialog.create();
        alert.setTitle("Failure");
        alert.setMessage("Failed to connect to printer");
        alert.show();
    }

除了上下文,我已经了解了所有内容。

制造商提到

 * @param context - Activity for displaying messages to the user

我如何使用上述功能,因为在我使用它的方式中,我没有收到任何错误,也没有收到任何警告信息。

5 个答案:

答案 0 :(得分:2)

要显示Alert(或任何其他UI组件),您需要Activity上下文,这是正确的。如果此时没有运行任何活动,则无法显示警报。

但您可以使用类Toast的静态方法显示Toast:

public static Toast makeText(Context context, CharSequence text, int duration);

将Application Context作为第一个参数传递给它。

应用程序上下文在您的应用程序运行时始终可用,即使此时没有运行UI。您可以通过从上下文中调用 getApplicationContext()方法来获取它。如果您根本没有任何上下文,则可以始终使用在xml标记下的清单中定义的YourAppClass(公共类YourAppClass extends Application )。 最常见的做法是将 YourAppClass 设为单身,并且它始终可以在您应用中的任何代码点使用。

答案 1 :(得分:0)

Context是一个与Activity相关的类,你必须在show和AlertDialog,Toast,获取系统服务时使用它......它与arquitecture MVC有关,它有点长的解释。关于使用它,有两种方法。一个是由droidhot解释的,另一种方式是,例如,MainActivity.this,如果你在Main Activity(MainActivity.java文件)中使用AlertDialog,那么Main Activity将是启动Alert Dialog的那个。如果它是从另一个不是Activity的类启动的,则必须将上下文作为参数(例如,new Class(MainActivity.this))并在类中,例如,它将是公共类(Context) context)参数上下文是你必须使用的。

答案 2 :(得分:0)

Activity是Context的子类,因此如果您打印代码是Activity类的一部分,那么只需提供this作为满足SDK要求所需的上下文:

port = StarIOPort.getPort(portName, portSettings, 10000, this);

以后

Builder dialog = new AlertDialog.Builder(this);

答案 3 :(得分:0)

上下文是您的活动。

private Context context;
context = this;

这是一个完整的示例活动。

package com.example.helloworld;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import <my_star_io_library>;

public class HelloWorld extends Activity 
{
    private Context context;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

        //Save context
        context = this;

        StarIOPort port = null; 
        byte[] texttoprint = new byte[]{0x1b, 0x40, 0x1b,0x74,0x0D,(byte) 0x91,(byte) 0x92,(byte) 0x93,(byte) 0x94,(byte) 0x95,(byte) 0x96,(byte) 0x97,(byte) 0x98,(byte) 0x99,0x0A,0x0A,0x0A,0x0A,0x0A}; 

        try  
        { 
            port = StarIOPort.getPort(portName, portSettings, 10000, context); 
            port.writePort(textToPrint, 0, textToPrint.length); 
            port.writePort(new byte[] {0x0a}, 0, 1); 
        } 
        catch (StarIOPortException e) 
        { 
            Builder dialog = new AlertDialog.Builder(context); 
            dialog.setNegativeButton("Ok", null); 
            AlertDialog alert = dialog.create(); 
            alert.setTitle("Failure"); 
            alert.setMessage("Failed to connect to printer"); 
            alert.show(); 
        } 
    }
}

答案 4 :(得分:0)

我在这里发布了答案: Android Phonegap Plugin different result on virtual and real device (Looper.prepare() ERROR)

我遇到了一些在某些设备上出现的问题。成功地,一个聪明的男孩,托比,帮助了我。所以,解决方案是下一个:
- 在调用任何StarIOPort的方法之前,你必须检查looper是否存在:

if (Looper.myLooper() == null) {
    Looper.prepare();
}

在你的情况下它会是这样的:

 try 
 {
    if (Looper.myLooper() == null) {
        Looper.prepare();
    }
    port = StarIOPort.getPort("BT:", "mini", 10000, null);
        try
        {
            Thread.sleep(500);
        }
        catch(InterruptedException e) {}

    port.writePort(texttoprint, 0, texttoprint.length);
        try
        {
            Thread.sleep(3000);
        }
        catch(InterruptedException e) {}

    resultType = "success";
 }
 catch (StarIOPortException e)
 {
     resultType = "error";
 }

还有一个建议:
代替

port = StarIOPort.getPort("BT:", "mini", 10000, null);

仅使用

port = StarIOPort.getPort("BT:", "mini", 10000);

在插件中你不会使用Context

祝你好运。